Tauri网易云扫描二维码登录

15 篇文章 1 订阅

先上页面代码

<template>
  <div class="bbox">
    <div class="top titlebar" data-tauri-drag-region>
      <div class="topp" data-tauri-drag-region>
        <div data-tauri-drag-region>登录</div>

        <div class="ttt">
          <div
            class="titlebar-button"
            id="titlebar-close"
            style="cursor: pointer"
          >
            <svg
              class="icon icon_close"
              style="
                width: 1em;
                height: 1em;
                vertical-align: middle;
                fill: currentColor;
                overflow: hidden;
                color: white;
              "
              viewBox="0 0 1024 1024"
              version="1.1"
              xmlns="http://www.w3.org/2000/svg"
              p-id="3700"
            >
              <path
                d="M548.992 503.744L885.44 167.328a31.968 31.968 0 1 0-45.248-45.248L503.744 458.496 167.328 122.08a31.968 31.968 0 1 0-45.248 45.248l336.416 336.416L122.08 840.16a31.968 31.968 0 1 0 45.248 45.248l336.416-336.416L840.16 885.44a31.968 31.968 0 1 0 45.248-45.248L548.992 503.744z"
                p-id="3701"
              ></path>
            </svg>
          </div>
        </div>
      </div>
    </div>
    <div class="mid" v-show="data.ewm_show1">
      <div class="left">
        <!-- <img
          src="
         https://p5.music.126.net/obj/wo3DlcOGw6DClTvDisK1/9643571155/525c/faac/2dc6/fe695c03c7c358ddaa4651736b26a55f.png"
          alt=""
        /> -->
        <img src="../assets/images/ewm/1.png" alt="">
      </div>
      <div class="right">
        <div class="rightt">扫码登陆</div>
        <img :src="data.qrimgs" alt="" style="width: 200px; height: 200px" />
        <!-- <div class="rightb">
          使用&nbsp;<a
            href="https://music.163.com/#/download"
            style="color: skyblue"
            >网易云app</a
          >
          扫码登录
        </div> -->
        <div>
          <el-button round @click="else_login">选择其他登录模式</el-button>
        </div>
      </div>
    </div>
    <div class="box" v-show="data.ewm_show2">
      <div>
        <div style="margin-top:30px;">
          <!-- <img
            style="width:150px;height:150px;"
            src="https://p6.music.126.net/obj/wo3DlcOGw6DClTvDisK1/9765284460/1b1d/9f46/2fa3/2d5d07bb5fcf8c24c1ad788c923ef313.png"
            alt=""
          /> -->
          <img src="../assets/images/ewm/2.png" alt="">
        </div>
        <div>扫描成功</div>
        <div>请在手机上确认</div>
      </div>
    </div>
    <div class="box" v-show="data.ewm_show3">
      <div>
        <div style="margin-top:30px;">
          <!-- <img
            style="width:150px;height:150px;"
            src="https://img1.baidu.com/it/u=1950256038,1337595389&fm=253&fmt=auto&app=138&f=JPEG?w=454&h=378"
            alt=""
          /> -->
          <img src="../assets/images/ewm/3.png" alt="">
        </div>
        <div>确认成功</div>
      </div>
    </div>
    <div class="box" v-show="data.ewm_show4">
      <div>
        <div style="margin-top:30px;">
          <!-- <img
            style="width:150px;height:150px;"
            src="https://img2.baidu.com/it/u=2770401062,667969626&fm=253&fmt=auto&app=138&f=JPEG?w=497&h=500"
            alt=""
          /> -->
          <img src="../assets/images/ewm/4.png" alt="">
        </div>
        <div>二维码失效</div>
      </div>
    </div>
  </div>
</template>

<script lang="ts" setup>
import { http } from "@tauri-apps/api";
// import bus from "../utils/index";
import { onMounted, ref, reactive, watch } from "vue";
import { appWindow, WebviewWindow } from "@tauri-apps/api/window"; //引入打开窗口功能
import {
  ElMessage,
  ElMessageBox,
  ElButton,
  ElAutocomplete,
} from "element-plus";
import { useRouter } from "vue-router";
const router = useRouter();

const data = reactive({
  unikey: "", //key
  qrurl: "",
  qrimgs: "", //二维码图片
  qrCheckData: {}, //状态
  isLogin: false, //是否登录
  ewm_show1: true,
  ewm_show2: false,
  ewm_show3: false,
  ewm_show4: false,
});

watch(
  () => data.isLogin,
  (newval, oldval) => {
    let times = setInterval(async () => {
      qrCheck();
      let code = data.qrCheckData.code;
      // }
      if (code === 801) {
        console.log("watch:等待扫码");
      } else if (code === 802) {
        console.log("watch:等待确认");
        data.ewm_show1 = false;
        data.ewm_show2 = true;
      } else if (code === 803) {
        data.ewm_show3 = true;
        data.ewm_show1 = false;
        data.ewm_show2 = false;
        console.log("watch:确认成功");
        sessionStorage.setItem("user", true);
        
        // 用户登录成功之后操作
        // router.push({ path: "index" });

        //用户登录成功后清除定时器
        clearInterval(times);
        //获取登录之后的uid和用户详情以及登录状态
        getStatus();
        getUinfo();
        localStorage.setItem("testtestinfo",'我是测试能不能获取信息')
        console.log('success');
        
        // bus.emit("login_success");

        // appWindow.close();
      } else if (code === 800) {
        data.ewm_show4 = true;
        data.ewm_show1 = false;
        data.ewm_show2 = false;
        data.ewm_show3 = false;
        console.log("watch:二维码过期");
        router.go(0);
      }
    }, 5000);
  }
);

const else_login = () => {
  router.push({ path: "else_login" });
};

//获取二维码的key值
const getKey = () => {
  http
       // http://127.0.0.1:8000这里填你服务器部署网易云api的ip地址,我在本地部署网易云api,所以用的是127.0.0.1:8000
    .fetch("http://127.0.0.1:8000/login/qr/key", {
      headers: {
        Authorization: "Bearer test",
      },
      method: "GET",
      // *** 注意:get请求的参数值必须为字符串,不然tauri会报错,这是tauri框架的要求;可以自己手动进行字符串强制转换 ***
      query: {
        timerstamp: new Date().getTime().toString(),
      },
      // params: {
      //   timerstamp: new Date().getTime(),
      // },
    })
    .then((res) => {
      data.unikey = res.data.data.unikey;
      loginQqr(data.unikey);
    });
};

//通过key去获取二维码
const loginQqr = (key) => {
  http
// http://127.0.0.1:8000这里填你服务器部署网易云api的ip地址,我在本地部署网易云api,所以用的是http://127.0.0.1:8000
    .fetch(
      "http://127.0.0.1:8000/login/qr/create?key=" + key + "&qrimg=true",
      {
        headers: {
          Authorization: "Bearer test",
        },
        method: "GET",
        // *** 注意:get请求的参数值必须为字符串,不然tauri会报错,这是tauri框架的要求;可以自己手动进行字符串强制转换 ***
        params: {
          timerstamp: new Date().getTime(),
        },
      }
    )
    .then((res) => {
      data.qrurl = res.data.data.qrurl;
      data.qrimgs = res.data.data.qrimg;
      qrCheck();
    });
};

//获取二维码的状态
const qrCheck = () => {
  http
// http://127.0.0.1:8000这里填你服务器部署网易云api的ip地址,我在本地部署网易云api,所以用的是127.0.0.1:8000
    .fetch("http://127.0.0.1:8000/login/qr/check?key=" + data.unikey, {
      headers: {
        Authorization: "Bearer test",
      },
      method: "GET",
      // *** 注意:get请求的参数值必须为字符串,不然tauri会报错,这是tauri框架的要求;可以自己手动进行字符串强制转换 ***
      query: {
        timerstamp: new Date().getTime().toString(), //传入参数时间戳
        withCredentials: "true",
      },
      // params: {
      //   timerstamp: new Date().getTime(), //传入参数时间戳
      //   withCredentials: true,
      // },
    })
    .then((res) => {
      console.log(res.data.message);

      data.qrCheckData = res.data;
      sessionStorage.setItem("cookie", res.data.cookie);
      data.isLogin = true;
    });
};

//获取登录之后的状态
const getStatus = () => {
  http
// http://127.0.0.1:8000这里填你服务器部署网易云api的ip地址,我在本地部署网易云api,所以用的是127.0.0.1:8000
    .fetch(
      `http://127.0.0.1:8000/login/status?cookie=${sessionStorage.getItem(
        "cookie"
      )}`,
      {
        headers: {
          Authorization: "Bearer test",
        },
        method: "GET",
        // *** 注意:get请求的参数值必须为字符串,不然tauri会报错,这是tauri框架的要求;可以自己手动进行字符串强制转换 ***
        params: {},
      }
    )
    .then((res) => {
      //   console.log('登录之后的状态'+res);
      sessionStorage.getItem("cookie");
      //   用户id   ???
      //   console.log(res.data.data.account.id, res.data.data.account.status);
      //   用户头像   昵称
      //   console.log(
      //     res.data.data.profile.avatarUrl,
      //     res.data.data.profile.nickname
      //   );

      sessionStorage.setItem("isLogin", res.data.data.account.status);
      sessionStorage.setItem("userid", res.data.data.account.id);
      sessionStorage.setItem("avatarUrl", res.data.data.profile.avatarUrl);
      sessionStorage.setItem("nickname", res.data.data.profile.nickname);

      // 0   豪先生5
      //   console.log(sessionStorage.getItem("isLogin"));
      //   console.log(sessionStorage.getItem("nickname"));
    });
};

//获取用户信息 , 歌单,收藏,mv, dj 数量
const getUinfo = () => {
  http
// http://127.0.0.1:8000这里填你服务器部署网易云api的ip地址,我在本地部署网易云api,所以用的是127.0.0.1:8000
    .fetch(
      "http://127.0.0.1:8000/user/detail?uid=" +
        sessionStorage.getItem("userid"),
      {
        headers: {
          Authorization: "Bearer test",
        },
        method: "GET",
        // *** 注意:get请求的参数值必须为字符串,不然tauri会报错,这是tauri框架的要求;可以自己手动进行字符串强制转换 ***
      }
    )
    .then((res) => {
      //   console.log("0000000");
      //   console.log(res);
      // console.log(res.data.data.code);
    });
};
onMounted(() => {
  // console.log(new Date().getTime().toString());
  getKey();
  //   document
  //     .getElementById("titlebar-minimize")
  //     .addEventListener("click", () => appWindow.minimize());
  document
    .getElementById("titlebar-close")
    .addEventListener("click", () => appWindow.close());
});
</script>


<style lang="scss" scoped>
.bbox {
  //   margin: auto;
  //   position: relative;
  width: 535px;
  height: 350px;
  background-color: #fff;
  border: #333 solid 1px;
}
.top {
  width: 534px;
  height: 50px;
  //   background-color: #2D2D2D;
  background-color: #fd544e;

  color: white;
  z-index: 3000;
}
.titlebar-button {
  padding: 0 15px;
}
.topp {
  font-weight: bold;
  //   margin-left: 18px;
  //   margin-right: 18px;
  //   padding-top: 16px;
  display: flex;
  justify-content: space-between;
  padding-top: 15px;
  padding-left: 20px;
  //   padding-right: 15px;
}
.ttt {
  display: flex;
  justify-content: space-between;
}
.mid {
  padding: 30px 30px 0 30px;
  display: flex;
}
.left img {
  width: 125px;
  height: 220px;
  margin-left: 20px;
}
.right {
  margin-left: 20px;
  display: flex;
  align-content: space-between;
  flex-direction: column;
}
.rightt {
  margin-left: 5px;
  font-size: 18px;
  font-weight: 500;
  color: #333;
  // width: 200px;
  // height: 24px;
  color: rgba(0, 0, 0, 0.4);
}
.rightb {
  margin-left: 15px;
}
.but {
  position: absolute;
  bottom: 0;
  margin-left: 10px;
}
.mid {
  margin-left: 50px;
}
.box{
  display: flex;
  justify-content: center;
  text-align: center;
}
</style>

效果:

手机扫描之后

手机确认之后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豪先生5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值