微信小程序(黑马优购:登录)

1.点击结算进行条件判断

user.js

  //数据
  state: () =>({
    // address: {}
    address: JSON.parse(uni.getStorageSync('address') || '{}'),
    token: ''
  }),

 my-settle.vue

  computed: {
      ...mapGetters('m_cart',['checkedCount','total','checkedGoodsAmount']),
      ...mapGetters('m_user',['addstr']),
      ...mapState('m_user',['token'])

  //用户点击了结算按钮
      settlement(){
        if(!this.checkedCount) return uni.$showMsg('请选择要结算的商品!')
          
        if(!this.addstr) return uni.$showMsg('请选择收货地址')
        
        if(!this.token) return uni.$showMsg('请先登录!')
      }

2.创建登录(my-login)和用户信息组件(my-userinfo)

my-login.vue

 //绘制底部半圆的造型
    &::after{
      content: ' ';
      display: block;
      width: 100%;
      height: 40px;
      background-color: white;
      position: absolute;
      bottom: 0;
      left: 0;
      border-radius: 100%;
      //往下移50%
      transform: translateY(50%);
    }

3.登录授权

如果没有显示下面的弹框,基础库设置为最低版本即可

  methods:{
      //用户授权之后,获取用户的基本信息
      getUserinfo(e){
        console.log(e);
        if(e.detail.errMsg === 'getUserInfo:fail auth deny') return uni.$showMsg('您取消了登录授权!')
      }
    }

 3.将用户的基本信息存储到Vuex

  //数据
  state: () =>({
    // address: {}
    address: JSON.parse(uni.getStorageSync('address') || '{}'),
    token: '',
    //用户的信息对象
    userinfo: JSON.parse(uni.getStorageSync('userinfo') || '{}')
  }),

  saveUserInfoToStorage(state){
      uni.setStorageSync('userinfo',JSON.stringify(state.userinfo))
    }

 my-login.vue

<script>
  import {mapMutations} from 'vuex'
  export default {
    data() {
      return {
        
      };
    },
    methods:{
      ...mapMutations('m_user',['updateUserInfo']),
      //用户授权之后,获取用户的基本信息
      getUserinfo(e){  
        if(e.detail.errMsg === 'getUserInfo:fail auth deny') return uni.$showMsg('您取消了登录授权!')
        console.log(e.detail.userInfo);
        this.updateUserInfo(e.detail.userInfo)
      }
    }
    
  }
</script>

4.调用uni.login

1)拿到code值

  //用户授权之后,获取用户的基本信息
      getUserinfo(e){  
        if(e.detail.errMsg === 'getUserInfo:fail auth deny') return uni.$showMsg('您取消了登录授权!')
        console.log(e.detail.userInfo);
        this.updateUserInfo(e.detail.userInfo)
        this.getToken(e.detail)
      },
      async getToken(info){
        //获取code对应的值
        const [err,res] = await uni.login().catch(err => err)
        console.log(res);
        if( err || res.errMsg !== 'login:ok'){
          return uni.$showMsg('登录失败!')
        }
        console.log(res.code);
        console.log(info);
      } 
      

user.js

token: uni.getStorageInfoSync('token') || '',

updateToken(state,token){
      state.token = token
      this.commit('m_user/saveTokenToStorage')
    },
    saveTokenToStorage(state){
      uni.setStorage('token',state.token)
    }

...mapMutations('m_user',['updateUserInfo','updateToken']),

2)持久化存储token

await uni.$http.post('/api/public/v1/users/wxlogin',query)这里的接口不能获取到token值,

直接把token写死

my-login.vue

 data() {
      return {
         token : 'abc147258369jkl'
      };
    },

   async getToken(info){
        //获取code对应的值
        const [err,res] = await uni.login().catch(err => err)
        console.log(info);
        if( err || res.errMsg !== 'login:ok'){
          return uni.$showMsg('登录失败!')
        }
         console.log(res);
        //准备参数
        const query = {
          code: res.code,
          encryptedData: info.encryptedData,
          iv: info.iv,
          rawData: info.rawData,
          signature: info.signature
        }
       const { data: loginResult } = await uni.$http.post('/api/public/v1/users/wxlogin',query)
       console.log(loginResult);
       if(loginResult.meta.status !== 200 ) {
             uni.$showMsg('登录成功')
              uni.setStorageSync('token',this.token);
             this.updateToken(this.token)
       }

4.获取用户信息

渲染头像和名称

<view class="top-box">
          <image :src="userinfo.avatarUrl" class="avatar"></image>
          <view class="nickname">{{userinfo.nickname}}</view>
      </view>

import { mapState } from 'vuex' 

computed:{
      ...mapState('m_user',['userinfo'])
    }

5.退出登录

  methods:{
      ...mapMutations('m_user',['updateAddress','updateUserInfo','updateToken']),
      async logout(){
        const [err,succ] = await uni.showModal({
          title: '提示',
          content: '确认退出登录吗?'
        }).catch(err => err)
        if(succ && succ.confirm){
          this.updateAddress({})
          this.updateUserInfo({})
          this.updateToken('')
        }
      }
      

6.如果用户没有登录,则3秒后自动跳转到登录页面

my-settle.vue

   return {
        //倒计时的秒数
        seconds: 3,
        //定时器的Id
        timer: null
      };

 //延时导航到my页面
      delayNavigate(){

        this.seconds = 3
          this.showTips(this.seconds)
          this.timer = setInterval(()=>{
            this.seconds--
            if(this.seconds <= 0){
              clearInterval(this.timer)
              uni.switchTab({
                url: '/pages/my/my'
              })
              return
            }
            this.showTips(this.seconds)
          },1000)
      },

 //展示倒计时的提示消息
      showTips(n){
        uni.showToast({
          icon: 'none',
          title: '请登录后再结算! '+n+' 秒之后自动跳转到登录页',
          mask: true,
          duration: 1500
        })
      

7.登录成功之后再返回之前的页面

user.js

  //重定向的Object对象
    redirectInfo: null

  updateRedirectInfo(state,info){
      state.redirectInfo = info
      console.log(state.redirectInfo);
    }

my-login.vue

   computed:{
        ...mapState('m_user',['redirectInfo'])
    },

.methods:{
      ...mapMutations('m_user',['updateUserInfo','updateToken','updateRedirectInfo']),

  if(loginResult.meta.status !== 200 ) {
             uni.$showMsg('登录成功')
             this.updateToken('abc147258369jkl')
             this.navigateBack()
       }

 navigateBack(){
        // this.redirectInfo.openType === 'switchTab':重定向的方式是switchTab
        if(this.redirectInfo && this.redirectInfo.openType === 'switchTab'){
          uni.switchTab({
            url:this.redirectInfo.from,
            complete: ()=>{
              this.updateRedirectInfo(null)
            }
          })
        }
      }

my-settle.vue

 //延时导航到my页面
      delayNavigate(){
          this.seconds = 3
          this.showTips(this.seconds)
          this.timer = setInterval(()=>{
            this.seconds--
            if(this.seconds <= 0){
              clearInterval(this.timer)
              uni.switchTab({
                url: '/pages/my/my',
                success: () => {
                  this.updateRedirectInfo({
                    openType: 'switchTab',
                    from: '/pages/cart/cart'
                  })
                }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/293277.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP种子是什么?理解和应用

在网络世界中&#xff0c;IP种子是一个广泛应用于文件共享和网络下载领域的概念。它是一种特殊的标识符&#xff0c;用于识别和连接到基于对等网络&#xff08;P2P&#xff09;协议的文件共享网络中的用户或节点。本文将深入探讨IP种子的含义、作用以及其在网络中的应用。 IP地…

【Linux】TCP网络套接字编程+守护进程

文章目录 日志类&#xff08;完成TCP/UDP套接字常见连接过程中的日志打印&#xff09;单进程版本的服务器客户端通信多进程版本和多线程版本守护进程化的多线程服务器 日志类&#xff08;完成TCP/UDP套接字常见连接过程中的日志打印&#xff09; 为了让我们的代码更规范化&…

瑞_23种设计模式_观察者模式

文章目录 1 观察者模式&#xff08;Observer Pattern&#xff09;1.1 介绍1.2 概述1.3 观察者模式的结构1.4 观察者模式的优缺点1.5 观察者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK中提供的观察者模式实现 ★4.1 Observable类4.2 Obse…

Day63-LVS四层负载均衡及结合Nginx7层负载均衡实践

Day63-LVS四层负载均衡及结合Nginx7层负载均衡实践 1. LVS&#xff08;Linux Virtual Server&#xff09;介绍2. IPVS&#xff08;LVS&#xff09;发展史3. IPVS软件工作层次图4. LVS技术点小结5. LVS的4模式原理讲解5.1 NAT(Network AddressTranslation)&#xff0c;中文网络地…

《Retrieval-Augmented Generation for Large Language Models: A Survey》 AI 解读

论文链接&#xff1a;Retrieval-Augmented Generation for Large Language Models: A Survey 论文标题&#xff1a;《Retrieval-Augmented Generation for Large Language Models: A Survey》 一译中文版地址&#xff1a; https://yiyibooks.cn/arxiv/2312.10997v5/index.htm…

PI案例分享--2000A核心电源网络的设计、仿真与验证

目录 摘要 0 引言 1 为什么需要 2000A 的数字电子产品? 2 2000A 的供电电源设计 2.1 "MPM3698 2*MPM3699"的 MPS扩展电源架构 2.2 使用恒定导通时间(COT)模式输出核心电压的原因 2.3 模块化 VRM 的优势 2.4 用步进负载验证2000A的设计难点 2.4.1 电源网络 …

qtcreator的信号槽链接

在ui文件中简单创建一个信号槽连接并保存可以在ui_mainwindow.h下 class Ui_MainWindow 类 void setupUi(QMainWindow *MainWindow)函数 找到对应代码 QObject::connect(pushButton, SIGNAL(clicked()), MainWindow, SLOT(close())); 下拉&#xff0c;由于 class MainWind…

《权力》为什么只为某些人所拥有 - 三余书屋 3ysw.net

权力&#xff1a;为什么只为某些人所拥有 大家好&#xff0c;今天我们解读的书名是《权力》&#xff0c;副标题是“为什么只为某些人所拥有”。该书深入探讨了职场中的权力议题&#xff0c;强调获得权力是关键的职场技能之一。在激烈的职场竞争中&#xff0c;缺乏这一技能将使…

C#(winform) 调用MATLAB函数

测试环境 VisualStudio2022 / .NET Framework 4.7.2 Matlab2021b 参考&#xff1a;C# Matlab 相互调用 Matlab 1、编写Matlab函数 可以没有任何参数单纯定义matlab处理的函数&#xff0c;输出的数据都存在TXT中用以后期读取数据 function [result,m,n] TEST(list) % 计算…

Python 后端 Flask 使用 Flask-SocketIO、前端 Vue3 实现长连接 Websocket 通信详细教程(更新中)

Flask 安装 Flask-Socketio Flask-SocketIO 第三方库使 Flask 应用程序可以实现客户端和服务器之间的低延迟双向通信。客户端应用程序可以使用 Javascript、Python、C、Java 和 Swift 中的任何 SocketIO 客户端库或任何其他兼容客户端来建立与服务器的永久连接。 Flask-Socke…

逐步学习Go-Select多路复用

概述 这里又有多路复用&#xff0c;但是Go中的这个多路复用不同于网络中的多路复用。在Go里&#xff0c;select用于同时等待多个通信操作&#xff08;即多个channel的发送或接收操作&#xff09;。Go中的channel可以参考我的文章&#xff1a;逐步学习Go-并发通道chan(channel)…

使用 Yoda 和 ClickHouse 进行实时欺诈检测

背景 Instacart 是北美领先的在线杂货公司,拥有数百万活跃的客户和购物者。在其平台上打击欺诈和滥用行为不仅对于维护一个值得信赖和安全的环境至关重要,也对保持Instacart的财务健康至关重要。在这篇文章中,将介绍了一个欺诈平台——Yoda,解释了为什么我们选择ClickHous…

【踩坑】荣耀系统Android8.0 system目录Read-only file system

本来以为直接把Charles证书改成系统证书格式&#xff0c;然后通过mt管理器root之后移动到系统证书目录就行了&#xff0c;结果访问baidu仍然显示网络错误&#xff0c;折腾一晚上。后来直接安装为用户证书&#xff0c;与系统证书冲突。 手机型号&#xff1a;荣耀v10 EMUI&…

升级程序到Java21的记录一(在先升级jdk到21)

背景&#xff1a;为了使用Java21的最新特性虚拟线程以及提高程序的整体性能&#xff0c;决定将一个程序A升级到Java21. 备注&#xff1a;程序A有很多文件操作因此使用虚拟线程对提升性能有帮助&#xff0c;如果读者的程序是其他类型&#xff0c;请参考虚拟线程的一些资料决定是…

STM32学习笔记(10_3)- 软件I2C读写MPU6050

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 本期开…

flutter官方案例context_menus

1&#xff1a;根据项目中的案例进行部署 2&#xff1a;运行查看有什么用&#xff0c;可不可以直接复制粘贴 案例地址 https://github.com/flutter/samples/tree/main/context_menus案例展示方法 直接把这个文件夹中的文件复制到lib文件夹中 3&#xff0c;19&#xff0c;4的fl…

Lazarus远控组件NukeSped分析

静态信息&#xff1a; 样本md5&#xff1a;9b656f5d7e679b94e7b91fc3c4f313e4 由此可见为假的Adobe Flash Player 的攻击样本 样本分析 通过五个函数&#xff0c;内部调用sub_40159D函数动态获取API函数 利用IDA python解密字符串。。 完整python代码 Python> idc.get_…

最优算法100例之18-列升序行升序的数组中查找元素

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样一…

LeetCode刷题【链表,图论,回溯】

目录 链表138. 随机链表的复制148. 排序链表146. LRU 缓存 图论200. 岛屿数量994. 腐烂的橘子207. 课程表 回溯 链表 138. 随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节…

计算机网络——32差错检测和纠正

差错检测和纠正 错误检测 EDC 差错检测和纠错位&#xff08;冗余位&#xff09; D 数据由差错检测保护&#xff0c;可以包含头部字段 错误检测不是100%可靠的 协议会泄露一些错误&#xff0c;但是很少更长的EDC字段可以得到更好的检测和纠正效果 奇偶校验 单bit奇偶校验 …