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 相关文章推荐
JS 中document.URL 和 windows.location.href 的区别
Nov 11 Javascript
HTML node相关的一些资料整理
Jan 01 Javascript
基于jquery的loading效果实现代码
Nov 05 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
May 02 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
May 27 Javascript
jquery实现的下拉和收缩效果示例
Aug 21 Javascript
2则自己编写的jQuery特效分享
Feb 26 Javascript
javascript制作照片墙及制作过程中出现的问题
Apr 04 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
Jul 24 Javascript
JavaScript封闭函数及常用内置对象示例
May 13 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
May 21 Javascript
微信小程序scroll-view点击项自动居中效果的实现
Mar 25 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
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
PHP数据库调用类调用实例(详细注释)
2012/07/12 PHP
跟我学Laravel之请求与输入
2014/10/15 PHP
php两种无限分类方法实例
2015/04/21 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
2015/12/21 PHP
php头像上传预览实例代码
2017/05/02 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
JS实现自动变化的导航菜单效果代码
2015/09/09 Javascript
AngularJs 国际化(I18n/L10n)详解
2016/09/01 Javascript
浅谈JQ中mouseover和mouseenter的区别
2016/09/13 Javascript
VsCode插件整理(小结)
2017/09/14 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
2017/09/19 Javascript
使用vue中的v-for遍历二维数组的方法
2018/03/07 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
小程序绑定用户方案优化小结
2019/05/15 Javascript
基于javascript的无缝滚动动画实现2
2020/08/07 Javascript
pandas DataFrame数据转为list的方法
2018/04/11 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
Python模拟登录和登录跳转的参考示例
2020/10/30 Python
奥地利度假券的专家:we-are.travel
2019/04/10 全球购物
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
2014年服务行业工作总结
2014/11/18 职场文书
客户经理岗位职责
2015/01/31 职场文书
学校运动会加油词
2015/07/18 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
部分武汉产收音机展览
2022/04/07 无线电