vue中uni-app 实现小程序登录注册功能


Posted in Javascript onOctober 12, 2019

思路:

1.使用微信的 open-type="getUserInfo" 获取用户信息,将用户信息保存到userinfoDetails对象中去。

<button v-else type="primary" class="reserve-btn" open-type="getUserInfo" @getuserinfo="getuserinfo">预约挂号</button>

2.使用 uni.login() 获取code,并且把code传给后台,后台会返回openid

3.使用vuex和本地缓存保存相关状态值

备注vuex和本地缓存的区别:

vuex是响应式更新,页面不刷新数据也会实时更新,但是页面一刷新,数据可能会失效

本地缓存不会响应式更新,但是一刷新本地缓存就会更新。所以二者结合使用,前端小白不知道这个做法是否科学,

我把调用登录注册的方法封装到公共方法里

代码如下

import store from '@/store'
const app = {
 apiUrl: 'https://hoxxxxxxxxop.com/', //请求的地址
 _getuserinfo(res,ppid) {
 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 + 'small/id?code=' + res.code,
   success: (res) => {
    console.log(res)
    if (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 = ppid || ''
    console.log(userinfoDetails)
    uni.setStorageSync('userinfoDetails',userinfoDetails)
    }
    if(res.data.status == 0) {
    that.sendInfo(userinfoDetails) // 用户还没注册过需调用此方法
    console.log('我还没有注册')
    } else {
    uni.showToast({
     title: '登录成功',
     icon: 'success',
     duration: 2000
    })
    store.commit('login', res.data) // vuex的方法,存openid,userinfo,和更改isloginstatus状态值
    uni.setStorageSync('StorageloginStatus',true) // 补充本地存储 localStorage解决vuex刷新数据不保留
    uni.setStorageSync('Storageopenid',res.data.openid)
    uni.setStorageSync('Storageuserinfo',res.data.userinfo)
    }
    if (res.data.status == 0 && res.data.userinfo == 0) {
    uni.showToast({
     title: '登录失败',
     duration: 2000
    })
    }
   }
   })
  }
  })
  }
 });
 },
 sendInfo(userinfoDetails) {
 var that = this
 uni.request({
  url: this.apiUrl + 'sm/vip', //注册接口
  data: userinfoDetails,
  method: 'POST',
  success: (res) => {
  if(res.data.userinfo == 1) {
   uni.hideLoading()
   uni.showToast({
   title: '注册成功',
   icon: 'success',
   duration: 2000
   })
   store.commit('login', res.data) // vuex的方法,存openid,userinfo,和更改isloginstatus状态值
   uni.setStorageSync('StorageloginStatus',true)
   uni.setStorageSync('Storageopenid',res.data.openid)
   uni.setStorageSync('Storageuserinfo',res.data.userinfo)
  } else {
   uni.hideLoading()
   uni.showToast({
   title: res.data.msg,
   duration: 2000
   })
  }
  }
 })
 }
}
export default app;

在index.vue调用

用Vuex中的isloginStatus和缓存中的StorageloginStatus来控制是否显示登录的按钮

<button v-if="isloginStatus || StorageloginStatus" type="primary" class="reserve-btn" @click="goreserve">跳转</button>
<button v-else type="primary" class="reserve-btn" open-type="getUserInfo" @getuserinfo="getuserinfo">登录</button>
import app from '../../common/config.js'
export default {
 data() {
  return {
  ppid: "",
  StorageloginStatus: false
  }
 },
 computed: mapState({
  isloginStatus: state => state.isloginStatus,
 }),
 onLoad(option) {
  this.ppid = this.scene_decode(option.scene).ppid //封装的scene_decode() 方法
  this.StorageloginStatus = uni.getStorageSync('StorageloginStatus')
 },
 methods: {
  // 获取用户信息
  getuserinfo(res) {
  app._getuserinfo(res,this.ppid) // 封装好的方法 res是微信返回的用户信息,ppid是二维码携带的参数 
  },
  // 当注册或者登录成功 显示路由按钮
  goreserve() {
  console.log('去挂号了')
  }
 }
 }

vuex

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

Vue.use(Vuex)

const store = new Vuex.Store({
 state: {
 isloginStatus: false,
 userinfo: "", // 状态值
 openid: "", 
 userinfoDetails: {} ,// 头像姓名城市等。。。
 ppid: ""
 },
 mutations: {
 login(state,res) {
  state.isloginStatus = true,
  state.userinfo = res.userinfo, // 如果userinfo==1 --->已登录
  state.openid = res.openid 
 },
 saveUserinfoDetails(state,res) {
  state.userinfoDetails = res
 },
 savePPid(state,id) {
  stage.ppid = id // 存ppid
 }
 },
})
export default store

总结

以上所述是小编给大家介绍的vue中uni-app 实现小程序登录注册功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JavaScript XML实现两级级联下拉列表
Nov 10 Javascript
javascript unicode与GBK2312(中文)编码转换方法
Nov 14 Javascript
html dom节点操作(获取/修改/添加或删除)
Jan 23 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
Jan 23 Javascript
JavaScript弹窗基础篇
Apr 27 Javascript
BOM之navigator对象和用户代理检测
Feb 10 Javascript
基于Swiper实现移动端页面图片轮播效果
Dec 28 Javascript
JavaScript常用数组操作方法,包含ES6方法
May 10 Javascript
小程序云开发部署攻略(图文教程)
Oct 30 Javascript
Layui数据表格跳转到指定页的实现方法
Sep 05 Javascript
js实现左右轮播图
Jan 09 Javascript
JS pushlet XMLAdapter适配器用法案例解析
Oct 16 Javascript
Jquery 动态添加元素并添加点击事件实现过程解析
Oct 12 #jQuery
微信小程序 scroll-view 水平滚动实现过程解析
Oct 12 #Javascript
微信小程序iOS下拉白屏晃动问题解决方案
Oct 12 #Javascript
vue中添加与删除关键字搜索功能
Oct 12 #Javascript
jquery 遍历hash操作示例【基于ajax交互】
Oct 12 #jQuery
jquery 时间戳转日期过程详解
Oct 12 #jQuery
JS数组splice操作实例分析
Oct 12 #Javascript
You might like
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
ThinkPHP的URL重写问题
2014/06/22 PHP
PHP开发中csrf攻击的简单演示和防范
2017/05/07 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
PHP 图片合成、仿微信群头像的方法示例
2019/10/25 PHP
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
2013/12/10 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
2015/05/06 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
JS button按钮实现submit按钮提交效果
2016/11/01 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
基于js文件加载优化(详解)
2018/01/03 Javascript
vue.js计算属性computed用法实例分析
2018/07/06 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
Python中的with...as用法介绍
2015/05/28 Python
Window10+Python3.5安装opencv的教程推荐
2018/04/02 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
python中单下划线_的常见用法总结
2018/07/10 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
利用keras使用神经网络预测销量操作
2020/07/07 Python
python3.5的包存放的具体路径
2020/08/16 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
html5图片上传预览示例分享
2014/04/14 HTML / CSS
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
贯彻落实“八项规定”思想汇报
2014/09/13 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
欠款证明
2015/06/24 职场文书
Python并发编程实例教程之线程的玩法
2021/06/20 Python
SpringBoot Http远程调用的方法
2022/08/14 Java/Android