app扫码登录(前端-vue)

一、实现思路

  1. 下载二维码生成器(qrcodejs2)的依赖
  2. 从后端获取到唯一的key值,来生成二维码。有些公司是获取到key值后就直接生成,而有些是要求拼接成链接后再生成,都 没问题的 (下面代码将展示第二种)
  3. 前端不断轮询,查询二维码登录状态,如(我司是通过返回0-4之间的数字来判断登录状态的)
  4. 返回的数字为登录成功状态,则登录

二、效果

在这里插入图片描述
在这里插入图片描述

三、具体实现代码

3.1 下载依赖

npm install --save qrcodejs2

3.2 将qrcodejs2引入二维码登录页面

import QRCode from 'qrcodejs2';

3.3 代码

ps:代码不可直接引入,但是二维码模块还是比较详细的,给新手参考。以及解决了使用 rcode.clear() 不生效的坑。

<template>
    <div class="qr-code-box">
      <!-- 存放二维码的盒子 -->
      <div id="qrcode"></div>

      <div class="tt">
        <!-- 扫码成功,会有个图案覆盖在二维码上 -->
        <img
          v-if="this.showcodestate === '扫码成功'"
          src="../../../assets/images/qr-success.png"
        >
        <!-- 登录成功,会有个图案覆盖在二维码上 -->
        <img
          v-else-if="this.showcodestate ==='登录成功'"
          src="../../../assets/images/login-succcess.png"
        >
      </div>
    </div>

    <div class="code-text">请使用手机版xxx - 我的右上角 - 扫码登录</div>

    <!-- 登录失败弹出框 -->
    <el-dialog
      title="提示"
      :visible.sync="dialogVisible"
      width="30%"
    >
      <span>登录失败!!</span>
      <span
        slot="footer"
        class="dialog-footer"
      >
        <el-button
          type="primary"
          @click="dialogVisible = false"
        >确 定</el-button>
      </span>
    </el-dialog>
  </el-form>
</template>>

<script>
import QRCode from 'qrcodejs2';
import { qrcodelogin, getcodestate } from "@/api/user"; //引入api=>获取key值和轮询,登录的使用了vuex
export default {
  name: "codelogin",
  data () {
    return {
      // 后端返回来的key值
      key: '',
      // 放置拼接成的链接
      codeurl: '',
      // 扫码后的状态
      showcodestate: '',
      // 登录失败弹出框
      dialogVisible: false
    };
  },
  mounted () {
    this.getqrcodekey() //获取key值
    this.$nextTick(() => {
      this.getstate()  //轮询
    })
  },
  destroyed () {
    this.timeagain()
  },

  methods: {
    // 获取后端传来的key值,拼接成一个链接
    async getqrcodekey () {
      const codedata = await qrcodelogin();
      if (codedata.code === 20000) {
        this.key = codedata.data.key
        this.codeurl = 'http://www.xxxxxxxxxxxxxxxxxxxxxxxx/qr?key=' + this.key
        // 生成二维码
        let qrcode = new QRCode("qrcode", {
          width: 172,
          height: 172,
          text: this.codeurl, //需要生成的内容(看APP需要)
        });
        console.log(qrcode, 'qrcode');
        //因为隔两分钟就会生成一个新的二维码,因此需要把直接的删除了,以下两个是看别人的生效了,但是放在我的页面不生效,也记录下吧,给能用的上的人,若你用这个也没用 那就参考我接下来代码的写法吧 
        // qrcode.clear()
        // qrcode.makeCode(this.codeurl)
        qrcode._el.title = ""; //清除标题,不然鼠标停留在二维码上面会暴露二维码的内容
        this.getstate()
      }
    },

    // 循环调用后台接口,查看扫码状态
    async getstate () {
      if (this.key) {
        const statedata = await getcodestate(this.key);
        if (statedata.code === 20000) {
          // 判断状态
          if (statedata.data.state === 0) {
            this.showcodestate = '未扫码'
            this.timeagain() //继续每隔一秒调用接口查看状态一次
          } else if (statedata.data.state === 1) {
            this.showcodestate = '扫码成功'
            this.timeagain()
          } else if (statedata.data.state === 2) {
            this.showcodestate = '登录成功'
            //登录
            this.$store
              .dispatch("user/codelogin", this.key)
              .then(() => {
                this.$router.push({ path: '/layout' });
              })

          } else if (statedata.data.state === 3) {
            this.showcodestate = '登录失败'
            this.dialogVisible = 'true' //登录失败 弹出提示框
            new QRCode("qrcode").clear()  //清除原来的二维码
            this.getqrcodekey() // 重新获取key值
          } else if (statedata.data.state === 4) {
            this.showcodestate = '二维码超时'
            new QRCode("qrcode").clear()
            this.getqrcodekey()
          }
        }
      }
    },

    // 轮询登录接口状态
    timeagain () {
      setTimeout(() => {
        this.getstate()
      }, 1000)
    },
  }
}
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot和Vue前后端分离项目中实现扫码登录的步骤如下: 1. 首先,你需要在微信开放平台上创建一个网站应用,并获取到AppID和AppSecret。你可以参考微信开放平台的文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html 2. 在后端的Spring Boot项目中,你需要使用MyBatis来操作数据库,并使用Shiro来进行用户认证和授权。 3. 在前端Vue项目中,你可以使用Element UI来构建用户界面。 4. 在前端登录页面(login.vue)中,你需要导入vue-wxlogin插件,可以使用以下代码导入: ```javascript import wxlogin from 'vue-wxlogin' ``` 5. 在登录页面中,你可以使用vue-wxlogin插件来生成微信扫码登录二维码,并监听扫码成功的事件。你可以参考vue-wxlogin插件的文档来了解如何使用该插件。 6. 在后端的Spring Boot项目中,你需要创建一个接口来处理微信扫码登录的回调请求。当用户扫码成功后,微信会将授权码(code)传递给你的后端接口。你可以使用该授权码来获取用户的openid和access_token,并进行用户的登录操作。 7. 在后端接口中,你可以使用微信开放平台提供的API来获取用户的openid和access_token。你可以使用以下代码来获取用户的openid和access_token: ```java String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=YOUR_APPID&secret=YOUR_APPSECRET&code=CODE&grant_type=authorization_code"; String result = restTemplate.getForObject(url, String.class); ``` 其中,YOUR_APPID和YOUR_APPSECRET需要替换为你在微信开放平台上创建的网站应用的AppID和AppSecret,CODE是微信传递给你的后端接口的授权码。 8. 获取到用户的openid后,你可以根据openid来判断用户是否已经在你的系统中注册过。如果已经注册过,则直接进行用户登录操作;如果没有注册过,则可以根据openid创建一个新的用户,并进行用户登录操作。 9. 在用户登录成功后,你可以使用Shiro来进行用户的认证和授权操作。你可以参考Shiro的文档来了解如何使用Shiro进行用户认证和授权。 10. 最后,你可以根据业务需求来进行其他的操作,比如保存用户的登录状态、跳转到其他页面等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值