WeChatアプレット - ログインを実現するクラウド機能操作データベース

WeChat アプレットを開発する場合、クラウド データベースを操作する従来の方法を使用すると、コードの冗長性や保守や変更が容易ではないなどの多くの欠点があるため、現在はすべてクラウド機能に基づいてデータベースやその他のロジックを操作しています。たまたま私は、ショッピング モール、ゴミ分別、バックグラウンド システムを統合した WeChat アプレット テンプレートを開発しているのですが、この事例を通してクラウド機能について学びましょう。将来的に直接コピーすることもできて便利です。

必要なツール:

1、node.js

2、tcbルーター

デフォルトでは、誰もがnode.jsの基本的な知識を知っており、それ以上のことは言いません。

WeChat アプレット点群開発によって生成されたテンプレートを開き、cloudfunctions を右クリックして db という名前の新しい node.js クラウド関数関数を作成します (データベースを操作するための関数がすべてここにあるという意味です)。作成が完了すると、システムがテンプレートが自動的に生成されます。外部ターミナル ウィンドウで [db] を右クリックして開きます。

tcb-router をインストールします: npm install --save tcb-router

インストールが完了したら、db の package.json を開くと、インストールが成功したことを示す以下のメッセージが表示されます。

必要なコード:

const cloud = require('wx-server-sdk')
const TcbRouter = require('tcb-router');
cloud.init({
  env: "dd-aqou2"
})
let db = cloud.database()
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  let {
    APPID,
    OPENID
  } = wxContext
  const app = new TcbRouter({
    event
  })
  app.use(async (ctx, next) => {
    ctx.data = {};
    await next(); // 执行下一中间件
  });
  return app.serve();
}

このようにして基本的なフレームワークが構築され、次にログインロジックを記述します 小さなプログラム wx の API ユーザーの一意の識別子は openid データベースがこの openid を持っている場合、ユーザー情報は更新されますそうでない場合は、新しいユーザーが作成されます。tcb-router を使用するときに、値に他の名前を割り当てることができないという小さな問題が発生しました。そのため、戻り値の名前には常に ctx.data.xxx を使用しています。まずレンダリングを見てください。

 

 ログインしていない場合、他のボタンはクリックできません。

 次に、クラウド関数のロジックを見てみましょう。

 //  用户登录
  app.router("login", async (ctx, next) => {
    let {
      userInfo
    } = event
    //  连接数据库user
    let user = db.collection('user')
    let {
      total
    } = await user.where({
      OPENID: OPENID
    }).count()
    if (total) {
      await user.where({
          OPENID: OPENID
        })
        .update({
          data: userInfo
        })
    } else {
      await user.add({
        data: {
          nickName: userInfo.nickName,
          gender: userInfo.gender,
          avatarUrl: userInfo.avatarUrl,
          OPENID: OPENID,
          integral: 0, //总积分
          signTotal: 0, //连续签到天数
          signday: [] //签到日期
        }
      })
    }
    let {
      data
    } = await user.where({
      OPENID: OPENID
    }).get()
    ctx.data.rank = await user.orderBy('integral', 'desc').get()
    ctx.body = {
      code: 0,
      msg: "添加成功",
      userInfo: data[0],
      rank: ctx.data.rank
    }
    return
  });

次に、アプレット側でクラウド関数を呼び出します (クラウド関数をデプロイすることを忘れないでください。データベースを右クリックしてアップロードしてデプロイし、依存関係をクラウドにインストールします)。

ログインボタンイベントを見つける

    /**
     * 获取用户信息
     */
    handleGetUserInfo(e) {
        wx.getUserProfile({
            desc: '用于完善个人资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
            success: (res) => {
                this.setData({
                    cloudID: res.cloudID,
                })
                wx.cloud.callFunction({
                    // 要调用的云函数名称
                    name: "db",
                    // 传递给云函数的参数
                    data: {
                        $url: "login", // 要调用的路由的路径,传入准确路径或者通配符*
                        userInfo: res.userInfo,
                    },
                    success: (res) => {
                        this.setData({
                            userInfo: res.result.userInfo
                        })
                        this.getRank(res.result.rank.data)
                    },
                });
            },
            fail: (res) => {}
        })
    },

フロントエンド中心でバックエンドの知識がしっかりしていないため、ランキングのロジックをフロントエンドに置いています

  /**
     * 获取排名
     */
    getRank(arr) {
        for (let i = 0; i < arr.length; i++) {
            if (this.data.userInfo.OPENID === arr[i].OPENID)
                this.setData({
                    rank: i + 1
                })
        }
    }

おすすめ

転載: blog.csdn.net/yinzisang/article/details/122739217