云开发实战-如何维护用户表?(优化版)
发布于 4 年前 作者 fanxiuying 4566 次浏览 来自 分享

前言

之前写过一篇《云开发-如何维护用户表?》,这种方式是最简单的,经过阅读了一些开源项目的代码,我优化了部分写法。

对比

优化前实现思路:

  1. 通过 login 云函数获取 openid 存放到本地
  2. 在授权信息的时候去添加 userInfo
  3. 根据 openid 去查询是否已经存储
  4. 没有查到就是新用户进行添加并存放 id 到本地
  5. 查看后老用户就根据 id 进行更新信息

优化后实现思路:

  1. 在 app.js 通过 queryCurrentUser 云函数查询 openid 是否在用户表
  2. 得到状态后存放在 app.js 的全局变量 authorized 属性里面
  3. 当需要用户授权的时候判断状态,没有就跳转到授权页面
  4. 进行授权调用 authorize 云函数添加用户

代码

  1. 在 app.js 通过 queryCurrentUser 云函数查询 openid 是否在用户表
  2. 得到状态后存放在 app.js 的全局变量 authorized 属性里面。
wx.cloud.callFunction({
    // 云函数名称
    name: 'user',
    // 传给云函数的参数
    data: {
      action: 'queryCurrentUser'
    }
  }).then(res => {
      if (res.result.errMsg === 'user.query.ok') {
        this.onAuthorized(res.result.data.userInfo);
        this.authorized = true;
      }
      wx.hideLoading();
    })
    
 onAuthorized(userInfo) {
    this.authorized = true;
    this.globalData.userInfo = userInfo;
  },
  

queryCurrentUser 云函数

async queryCurrentUser(context, params) {
    const {
      OPENID
    } = context;

    let res = await db.collection('users').where({
      openid: OPENID
    }).get();

    if (res.data.length === 0) {

      return {
        errMsg: 'user.query.none'
      };

    }

    return {
      errMsg: 'user.query.ok',
      data: {
        userInfo: res.data[0].userInfo
      }
    };

  },
  1. 当需要用户授权的时候判断状态,没有就跳转到授权页面
    index.js
toInfo(res) {
    if (app.authorized !== true) {
      wx.navigateTo({
        url: '/pages/authorize/authorize'
      });
      return;
    }
    // 省略业务代码....
  }
  1. 进行授权调用 authorize 云函数添加用户
    authorize.js
wx.cloud.callFunction({
    // 云函数名称
    name: 'user',
    // 传给云函数的参数
    data: {
      action: 'authorize',
      userInfo: userInfo
    }
  }).then(res => {

        if (res.result.errMsg === 'user.authorize.ok' || res.result.errMsg === 'user.authorize:authorized') {

          app.onAuthorized(res.result.data.userInfo);
          wx.showLoading({
            title: '授权成功'
          });
          setTimeout(() => {
            wx.hideLoading();
            app.navigateBack();
          }, 1000);
          return;

        }

        wx.nextTick(() => {
          wx.showToast({
            title: '授权失败',
            icon: 'none',
            duration: 1000
          });
        });

      });

authorize 云函数

const authorizedRes = {
  env: cloud.DYNAMIC_CURRENT_ENV,
  errMsg: 'user.authorize:authorized'
};

async authorize(context, params) {

    const {
      OPENID
    } = context;

    let getRes = await db.collection('users').where({
      openid: OPENID
    }).get();

    if (getRes.errMsg !== 'collection.get:ok') {

      return errorAuthorizeRes;

    }

    if (getRes.data.length > 0) {

      return authorizedRes;

    }

    let addRes = await db.collection('users').add({
      data: {
        openid: OPENID,
        userInfo: params.userInfo,
        authorizedTime: new Date(),
      }
    });

   

    return {
      errMsg: 'user.authorize.ok',
      data: {
        userInfo: params.userInfo
      }
    };

  }

总结

这种方式优点如下:

  1. 用云函数来验证,云函数可以直接获取 openid
  2. 通用统一的授权页面进行授权,这样就不需要在不同的地方写同样的授权代码
  3. 添加逻辑在云函数中实现,改小程序前端代码需要重新发版,云函数部署就行

代码需要不断优化才能更好。

1 回复
回到顶部