wx微信小程序部分逻辑

html 复制代码
<view class="w-main">
  <text class="w-title">{{title}}</text>
  <text class="w-desc">{{desc}}</text>
  <block>
    <!-- 头像选择按钮,根据需要决定是否显示 -->
    <view class="nickname-wrapper">
      <text class="nickname-label">头像</text>
      <button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
        <image class="avatar" src="{{userInfo.avatarUrl}}"></image>
      </button>
    </view>

    <view class="nickname-wrapper">
      <text class="nickname-label">昵称</text>
      <input type="nickname" class="nickname-input" placeholder="请输入昵称" bind:change="onInputChange" />
    </view>
  </block>

  <block>
    <button bindtap="onAuthLogin" open-type="getUserInfo" class="w-login-btn" theme='primary'>
      确认授权登录
    </button>
  </block>
</view>
js 复制代码
const app = getApp(); //通过getApp()方法,能够获取App的实例,从而获取app.js文件中定义的公共数据globalData
// const defaultAvatarUrl = '../../images/no-login.png' // 先将avatarUrl设置为一个常量
const defaultAvatarUrl = 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0'

Page({
  /**
   * 页面的初始数据
   */
  data: {
    title: '登录确认',
    desc: '为保障您的账户安全,请确认是本人登录',
    openId: '',
    sessionKey: '',
    scene: '',
    userInfo: {
      avatarUrl: defaultAvatarUrl,
      nickName: '',
      avatarUrlBase64: ''
    },
    hasUserInfo: false,
    canIUseNicknameComp: wx.canIUse('input.type.nickname'),
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    this.setData({
      scene: decodeURIComponent(options.scene)
    })
    this.getOpenId();
  },

  getOpenId() {
    wx.login({
      success: res => {
        console.log("用户登录的临时凭证是:" + res.code);
        // 保存this到变量that中
        const that = this;
        wx.request({
          url: 'https://juejin.plus/prod-api/wx/public/getOpenId',
          method: 'POST',
          data: {
            code: res.code,
            scene: that.data.scene ? that.data.scene : '-1' // 使用that代替this
          },
          success: function (res) {
            if (res.data.code == 200) {
              console.log("用户openid:", res);
              // 使用变量that来引用页面实例
              that.setData({
                openId: res.data.data.openId,
                sessionKey: res.data.data.sessionKey
              });
            } else {
              wx.showToast({
                title: "用户openid获取失败",
                duration: 1000,
                icon: 'none',
                mask: true
              })
            }
          },
          fail: function (err) {
            console.log("失败")
          }
        });
      }
    });
  },

  onAuthLogin(e) {
    if (this.data.userInfo.avatarUrlBase64 === '') {
      wx.showToast({
        title: "请选择头像",
        duration: 1000,
        icon: 'none',
        mask: true
      })
      return
    }
    if (this.data.userInfo.nickName === '') {
      wx.showToast({
        title: "请输入昵称",
        duration: 1000,
        icon: 'none',
        mask: true
      })
      return
    }
    wx.getUserProfile({
      desc: '用于完善用户资料',
      success: (res) => {
        const that = this;
        that.setData({
          isLogin: true
        });
        console.log("用户信息:", res)
        var params = {
          'openId': that.data.openId,
          'sessionKey': that.data.sessionKey,
          'encryptedData': res.encryptedData,
          'rawData': res.rawData,
          'signature': res.signature,
          'iv': res.iv,
          'scene': that.data.scene ? that.data.scene : '-1',
          'nickName': that.data.userInfo.nickName,
          'avatarUrlBase64': that.data.userInfo.avatarUrlBase64,
        }
        console.log("param:", params)
        wx.request({
          url: 'https://juejin.plus/prod-api/wx/public/getWxUserInfo',
          method: 'POST',
          data: params,
          success: function (res) {
            if (res.data.code == 200) {
              that.setData({
                isLogin: true
              });
              app.globalData.loginState = true;
              console.log("登录状态修改成功")
              wx.showToast({
                title: '登录成功!',
                icon: 'success',
                duration: 3000,
                success: res => {
                  setTimeout(() => {
                    wx.reLaunch({
                      url: '/pages/home/home',
                    })
                  }, 2000)
                },
              })
            } else {
              wx.showToast({
                title: "登录失败",
                duration: 1000,
                icon: 'none',
                mask: true
              })
            }
          }
        })
      }
    })
  },

  onChooseAvatar(e) {
    const {
      avatarUrl
    } = e.detail

    //对临时图片链接进行base64编码
    var avatarUrl_base64 = 'data:image/jpeg;base64,' + wx.getFileSystemManager().readFileSync(avatarUrl, 'base64')
    const {
      nickName
    } = this.data.userInfo
    this.setData({
      "userInfo.avatarUrl": avatarUrl,
      "userInfo.avatarUrlBase64": avatarUrl_base64,
      hasUserInfo: nickName && avatarUrl && avatarUrl !== defaultAvatarUrl,
    })
  },
  onInputChange(e) {
    const nickName = e.detail.value
    const {
      avatarUrl
    } = this.data.userInfo
    this.setData({
      "userInfo.nickName": nickName,
      hasUserInfo: nickName && avatarUrl && avatarUrl !== defaultAvatarUrl,
    })
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

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

  },

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

  },

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

  },

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

  },

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

  },

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

  },
})
相关推荐
大大花猫2 小时前
我用AI写了个小程序,却被人说没有底线…
前端·微信小程序·交互设计
梵尔纳多2 小时前
打包 Electron 程序
前端·javascript·electron
接着奏乐接着舞。2 小时前
3D地球可视化教程 - 第6篇:蜂巢网格与自定义几何体
前端·vue.js·3d·threejs
GISer_Jing2 小时前
Taro打造电商项目实战
前端·javascript·人工智能·aigc·taro
KLW752 小时前
vue watch监听
前端·javascript·vue.js
晴殇i3 小时前
🎉 TRAE 一年使用的过程体验 🎉
前端
GDAL3 小时前
Tailwind CSS Flex 布局深入全面教程
前端·css·tailwindcss
qq. 28040339843 小时前
react --> redux
前端·react.js·前端框架
前端不太难3 小时前
用 RN 的渲染模型,反推 Vue 列表的正确拆分方式
前端·javascript·vue.js