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 创建对象
Jul 17 Javascript
Javascript简单实现可拖动的div
Oct 22 Javascript
jquery css 设置table的奇偶行背景色示例
Jun 03 Javascript
extjs每个组件要设置唯一的ID否则会出错
Jun 15 Javascript
浅析node.js中close事件
Nov 26 Javascript
javascript DIV实现跟随鼠标移动
Mar 19 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
Dec 29 Javascript
微信小程序实现自定义picker选择器弹窗内容
May 26 Javascript
vue实现短信验证码登录功能(流程详解)
Dec 10 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
Dec 16 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
Mar 02 Javascript
ant design的table组件实现全选功能以及自定义分页
Nov 17 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
网站当前的在线人数
2006/10/09 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
2016/10/08 PHP
PHP封装函数实现生成随机的字符串验证码
2017/01/24 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
仅用[]()+!等符号就足以实现几乎任意Javascript代码
2010/03/01 Javascript
Three.js源码阅读笔记(光照部分)
2012/12/27 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
nodejs通过phantomjs实现下载网页
2015/05/04 NodeJs
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
2017/08/17 Javascript
vue里input根据value改变背景色的实例
2018/09/29 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
Python中zfill()方法的使用教程
2015/05/20 Python
Python中set与frozenset方法和区别详解
2016/05/23 Python
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
Python内建模块struct实例详解
2018/02/02 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
对python 命令的-u参数详解
2018/12/03 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
Python实现TCP通信的示例代码
2019/09/09 Python
virtualenv介绍及简明教程
2020/06/23 Python
python批量修改文件名的示例
2020/09/27 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
英语系毕业生求职信
2014/07/13 职场文书
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS