美文网首页
微信小程序:用户授权获取个人信息的一个思路

微信小程序:用户授权获取个人信息的一个思路

作者: 我的小小笔尖 | 来源:发表于2021-08-24 17:53 被阅读0次
  1. 小程序首页onLoad方法中判断是否已有用户个人信息(数据库查询)
    1.1 如果有用户个人信息,则将用户个人信息保存为全局数据,然后直接跳转到小程序主功能页面
    1.2 如果没有用户个人信息,则首页显示“开始使用”按钮
  1. 用户点击“开始使用”按钮
    1.1 冗余判读,如果已有用户个人信息,则将用户个人信息保存为全局数据,然后直接跳转到小程序主功能页面
    1.2 如果没有用户个人信息,则弹出对话框,提示允许使用微信头像和昵称,用户同意后将获取的用户个人信息保存到数据库,再将用户个人信息保存为全局数据,然后直接跳转到小程序主功能页面

主要代码如下:

first.wxml
<view class="page">

  <view class="text-center">
    <view class="text-xl text-grey">欢迎访问小程序</view>
    <view class="text-xxl text-green" style="padding-top: 50rpx; font-weight: bold">****</view>
  </view>
  
  <view class="text-xl text-grey" style="text-indent:72rpx;">****是一个辅助老师管理学生信息的效率工具,****提供了<text class="text-orange">学生考勤</text>、<text class="text-orange">家校联系</text>、<text class="text-orange">信息收集</text>、<text class="text-orange">数据统计</text>等功能。</view>

  <view class="text-center" hidden="{{hidddenBtn}}">
    <button type="primary" bindtap="startUseMiniProgram">开始使用</button>
    <view class="text-gray text-sm" style="padding-top: 20rpx;">请允许****使用微信头像和昵称</view>
  </view>

  <view></view>

</view>
first.js
var app = getApp()

Page({

  /**
   * 页面的初始数据
   */
  data: {
    hidddenBtn: true,
  },

  // 进入主页面
  enterMainPage() {
    let mainPageUrl = '/pages/attendance/index'
    wx.redirectTo({
      url: mainPageUrl,
    })
  },

  // 开始使用小程序
  startUseMiniProgram: function (e) {
    if(app.globalData.hasUserInfo) {
      // 已有用户个人信息,则进入小程序主页面(冗余判断)
      this.enterMainPage()
    }else {
      // 没有用户个人信息,则获取用户个人信息
      this.getUserProfile()
    }
  },
  
  // 获取用户头像和昵称信息
  getUserProfile() {
    var that = this
    // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认
    // 开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
    wx.getUserProfile({
      desc: '用于完善用户资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
      success: (res) => {
        // 将用户个人信息保存到数据库
        that.saveUserInfo(res.userInfo)
      }
    })
  },  

  // 保存用户个人信息到数据库
  saveUserInfo (userInfo) {
    var that = this
    wx.cloud.callFunction({
      name: 'v1_operationUserInfo',
      data: {
        action: 'saveUserInfo',
        userInfo: userInfo,
      },
      success: res => {
        console.warn('[云函数] [v1_operationUserInfo] saveUserInfo 调用成功:', res)
        // 再将用户个人信息保存为全局数据
        that.saveUserInfo2GlobaoData(userInfo)
      },
      fail: err => {
        console.error('[云函数] [v1_operationUserInfo] saveUserInfo 调用失败:', err)
      }
    })
  },

  // 查询用户信息
  searchUserInfo() {
    var that = this
    wx.cloud.callFunction({
      name: 'v1_operationUserInfo',
      data: {
        action: 'searchUserInfo',
      },
      success: res => {
        console.warn('[云函数] [v1_operationUserInfo] searchUserInfo 调用成功:', res)
        if(res.result!=null && res.result.data.length==1) {
          // 查询到用户信息
          let userInfo = res.result.data[0].userInfo
          // 再将用户个人信息保存为全局数据
          that.saveUserInfo2GlobaoData(userInfo)
        }else {
          // 没有查询到用户信息,显示开始使用按钮
          that.setData({
            hidddenBtn: false
          })
        }
      },
      fail: err => {
        console.error('[云函数] [v1_operationUserInfo] searchUserInfo 调用失败:', err)
      }
    })
  },

  // 将用户个人信息保存为全局数据后,小程序所有页面均可使用用户个人信息
  saveUserInfo2GlobaoData(userInfo) {
    // 保存为全局数据
    app.globalData.userInfo = userInfo
    app.globalData.hasUserInfo = true
    console.log('app.globalData', app.globalData)

    // 进入小程序主页面
    this.enterMainPage()
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // 查询是否已有用户信息
    this.searchUserInfo()
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})
first.wxss
page, .page {
  height: 100%;
}

.page {
  padding: 0 50rpx;

  display: flex;
  flex-direction: column;
  justify-content: space-around;
  align-items: center;
}

云函数:v1_operationUserInfo

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({
  traceUser: true,
  env: 'cloud1-4gdsuky0da99176e'
})

const db = cloud.database()
const _ = db.command

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  
  switch (event.action) {
    case 'saveUserInfo': {
      return saveUserInfo(event, wxContext)
    }
    case 'searchUserInfo': {
      return searchUserInfo(event, wxContext)
    }
    default: {
      return
    }
  }
}

// 写入用户信息
async function saveUserInfo(event, wxContext) {
  let date = new Date()
  let time = date.getTime()
  try {
    return await db.collection('v1_userInfo').add({
      data: {
        openid:  wxContext.OPENID,
        appid: wxContext.APPID,
        unionid: wxContext.UNIONID,

        userInfo: event.userInfo,
        
        createDate: date,
        createTime: time,
        dataStatus: 1 // 1-有效,0-无效(逻辑删除)
      }
    })
  } catch (e) {
    console.error(e)
  }
}

// 查询用户信息,如果一个用户查询出多条记录,取最新的一条记录
async function searchUserInfo(event, wxContext) {  
  try {
    return await db.collection('v1_userInfo')
    .where({openid: wxContext.OPENID})
    .orderBy('createTime', 'desc')
    .limit(1)
    .get()
  } catch (e) {
    console.error(e)
  }
}

相关文章

网友评论

      本文标题:微信小程序:用户授权获取个人信息的一个思路

      本文链接:https://www.haomeiwen.com/subject/gladiltx.html