uni-app微信小程序登录并使用vuex存储登录状态的思路详解


Posted in Javascript onNovember 04, 2019

微信小程序注册登录思路

(这是根据自身的项目的思路,不一定每个项目都适用)

1.制作授权登录框,引导用户点击按钮

2.uni.login获取code

3.把code传给后端接口,后端返回如下数据

openid: "ogtVM5RWdfadfasdfadfadV5s"
status: 1
// 状态码:status==0(该用户未注册,需调用注册接口) status==1(该用户已注册)

4.判断用户是否注册,并调用用户信息接口

(1)若已注册则提示登录成功,并调用后台给的获取用户信息的接口,并把数据保存到vuex

(2)若未注册则调用注册接口,注册成功之后调获取用户信息接口,并把数据保存到vuex

制作授权登录框

我把它写到一个组件里,在需要调用的页面注册该组件

authorization.vue组件

<template>
  <view class="pop">
    <view class="pop-main">
      <i class="iconfont cancel" @click="cancel">?</i>
      <view class="pop-title">需要您的授权</view>
      <view class="pop-text">
        <view>为了提供更好的服务</view> 
        <view>请在稍后的提示框中点击允许</view>
      </view>
      <image class="pop-imgsize" src="../static/images/aut.png" mode=""></image>
      <!-- 微信小程序的引导按钮,可以获取到用户信息 getuserinfo函数调用请求下面会讲到-->
      <button type="primary" class="reserve-btn" open-type="getUserInfo" @getuserinfo="getuserinfo">我知道了</button>
    </view>
  </view>
</template>

<script>
  import app from '../common/config.js'
  export default {
    data() {
      return {
        
      };
    },
    methods: {
      getuserinfo(res) {
      // 调用封装在app的_getuserinfo函数,_getuserinfo函数执行用户获取code,传code给后台,调用注册接口
        app._getuserinfo(res)
      },
      cancel() {
        this.$emit('cancelChild',false)
      }
    }
  }
</script>

<style scoped>
.pop {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(0,0,0,.3);
  z-index: 9999;
  display: flex;
  justify-content: center;
  align-items: center;
}
.pop-main {
  width: 690upx;
  height: 800upx;
  box-sizing: border-box;
  background-color: #FFFFFF;
  border-radius: 20upx;
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  font-size: 14px;
  padding: 64upx 0upx 40upx 0upx;
}
/* 删除按钮 */
.cancel {
  position: absolute;
  top: 20upx;
  right: 20upx;
  font-size: 20px;
}
.pop-title {
  padding-bottom: 40upx;
  width: 100%;
  border-bottom: 1px solid #BFBFBF;
  font-size: 16px;
  letter-spacing: 2px;
  text-align: center;
}
.pop-imgsize {
  width: 484upx;
  height: 406upx;
}
.pop-text {
  width: 75%;
  text-align: center;
  font-size: 15px;
  margin: 30upx 0upx;
  letter-spacing: 1px;
}
button {
  background-color: #08BF00;
  color: #FFFFFF;
  text-align: center;
  height: 88upx;
  line-height: 88upx;
  font-size: 14px;
  border-radius: 50upx;
  width: 78%;
}
</style>

在个人中心页注册该组件

<template>
  <view>
    <view class="info" >
      <image 
        @click="toSettings" 
        class="headimg" 
        :src="userinfo.headimgurl || defaultHeadimg" 
        >
      </image>
      <text v-if="!hasLogin" class="goLogin" @click="gologin">登录</text>
      <text v-if="hasLogin">{{userinfo.nickname}}</text>
      <text v-if="hasLogin && userinfo.mobile" class="phone">{{userinfo.mobile}}</text>
    </view>
    <authorization v-if="tologin && !hasLogin" @cancelChild="getChild"></authorization>
  </view>
</template>

uni-app微信小程序登录并使用vuex存储登录状态的思路详解 

点击"我知道了"按钮,调用封装_getuserinfo的请求

新建config.js,在config封装请求

import store from '@/store'
const app = {
  apiUrl: 'https://aaa.bbbbb.com/', //请求的地址
  openidRequest(obj) {
    try {
      const openid = uni.getStorageSync('openid');
      if (openid) {
        if(obj.data) {
          obj.data["openid"] = openid;
        } else {
          obj.data = {"openid": openid};
        }
        obj.url = this.apiUrl + obj.url;
        uni.request(obj)
      } else {
        console.log("获取不到openid")
      }
    } catch (e) {
      console.log(e)
      console.log("获取不到openid")
    }
  },
  _getuserinfo(res) {
    var that = this
    var userinfoDetails = {} // 注册时,需要把用户信息传给后台,所以定义一个对象存储获取到的用户信息
    userinfoDetails = res.detail.userInfo 
    uni.getUserInfo({
     provider: 'weixin',
     success: function () {
      uni.login({
        success:function(res){
          uni.showLoading({
            title: '登陆中...',
            mask: false
          });
          uni.request({
            url: that.apiUrl + 'sdafl/ddfax/dfadf?code=' + res.code, //把code传给后台,后台返回openid和status
            success: (res) => {
              console.log(res)
              if (res.data.openid) {
                uni.setStorageSync('openid', res.data.openid)
                userinfoDetails.openid = res.data.openid
                //处理一下属性名传递给后台
                userinfoDetails = JSON.parse(JSON.stringify(userinfoDetails).replace(/avatarUrl/g, "headimgurl"));
                userinfoDetails = JSON.parse(JSON.stringify(userinfoDetails).replace(/gender/g, "sex"));
                userinfoDetails = JSON.parse(JSON.stringify(userinfoDetails).replace(/nickName/g, "nickname"));
                delete userinfoDetails.language;
                userinfoDetails.ppid = store.state.ppid || ''
                console.log(userinfoDetails)
              }
              // 当status==0时说明用户还没有注册需要注册
              if(res.data.status == 0) {
                that.sendInfo(userinfoDetails) // 调用注册接口,并把用户信息userinfoDetails传给后台
                console.log('我还没有注册')
              } else if (res.data.status == 1) {
                uni.showToast({
                  title: '登录成功',
                  icon: 'success',
                  duration: 2000
                })
                that.getUserData() // 调用获取用户信息的接口
              } else {
                uni.hideLoading()
                uni.showToast({
                  title: '登录失败',
                  duration: 2000,
                  icon:'none'
                })
              }
            }
          })
        }
      })
     }
    });
  },
  // 注册接口
  sendInfo(userinfoDetails) {
    var that = this
    uni.request({
      url: this.apiUrl + 'fdafd/ifdaffdex/fdaff',
      data: userinfoDetails,
      method: 'POST',
      success: (res) => {
        if(res.data.userinfo == 1) {
          uni.hideLoading()
          uni.showToast({
            title: '注册成功',
            icon: 'success',
            duration: 2000
          })
          that.getUserData() // 调用获取用户信息的接口
        } else {
          uni.hideLoading()
          uni.showToast({
            title: res.data.msg,
            duration: 2000
          })
        }
      }
    })
  },
  // 获取用户信息
  getUserData() {
    uni.request({
      url: this.apiUrl + 'sfad/dfadfad/idfadffde', 
      data: {
        openid: uni.getStorageSync('openid')
      },
      method: 'POST',
      success: (res) => {
        if(res.data.status == 1) {
          console.log(res.data)
          store.commit('login', res.data.user) // vuex的方法
        } else {
          uni.showToast({
            title: res.data.msg,
            duration: 2000
          })
        }
      }
    })
  }
}
export default app;

vuex存储登录态的方法

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    hasLogin: false,
    userinfo: {},
    ppid: '',
  },
  mutations: {
    // 登录
    login(state,res) {
      state.hasLogin = true
      state.userinfo = res
      uni.setStorage({
        key: 'userinfo',
        data: res
      })
      // console.log(state.userinfo)
      // console.log(state.hasLogin)
    },
    // 二维码ppid
    saveppid(state,ppid) {
      state.ppid = ppid
      uni.setStorage({
        key: 'ppid',
        data: ppid
      })
      // console.log(state.ppid)
    },
  },
})

export default store

uni-app微信小程序登录并使用vuex存储登录状态的思路详解 

总结

以上所述是小编给大家介绍的uni-app微信小程序登录并使用vuex存储登录状态的思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
一个加载js文件的小脚本
Jun 28 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
Mar 13 Javascript
Javascript MVC框架Backbone.js详解
Sep 18 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
Feb 01 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
Feb 18 Javascript
javascript中JSON.parse()与eval()解析json的区别
May 19 Javascript
jQuery实现最简单实用的分秒倒计时
Feb 05 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
Mar 17 Javascript
js中的事件委托或是事件代理使用详解
Jun 23 Javascript
浅谈ECMAScript 中的Array类型
Jun 10 Javascript
js实现倒计时秒杀效果
Mar 25 Javascript
vue-路由精讲 二级路由和三级路由的作用
Aug 06 Javascript
JavaScript判断浏览器版本的方法
Nov 03 #Javascript
JavaScript算法学习之冒泡排序和选择排序
Nov 02 #Javascript
如何正确理解vue中的key详解
Nov 02 #Javascript
Javascript 关于基本类型和引用类型的个人理解
Nov 01 #Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
Nov 01 #Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
Nov 01 #Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
Nov 01 #Javascript
You might like
最小化数据传输――在客户端存储数据
2006/10/09 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
PHP文件操作方法汇总
2015/07/01 PHP
帝国cms目录结构分享
2015/07/06 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
php构造函数与析构函数
2016/04/23 PHP
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
js调用webservice中的方法实现思路及代码
2013/02/25 Javascript
replace()方法查找字符使用示例
2013/10/28 Javascript
JavaScript中的DSL元编程介绍
2015/03/15 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
python实现删除文件与目录的方法
2014/11/10 Python
在Python中使用next()方法操作文件的教程
2015/05/24 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
英国定做窗帘和纺织品面料一站式商店:Dekoria
2018/08/29 全球购物
N.Peal官网:来自伦敦的高档羊绒品牌
2018/10/29 全球购物
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
父亲追悼会答谢词
2014/01/17 职场文书
先进事迹报告会感言
2014/01/24 职场文书
幼儿园元旦家长感言
2014/02/27 职场文书
贸易跟单员英文求职信
2014/04/19 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
2015年护士节慰问信
2015/03/23 职场文书
工作后的感想
2015/08/07 职场文书
PyQt5实现多张图片显示并滚动
2021/06/11 Python