硅谷仿制网易云小程序登录问题解决

引言:

尚硅谷视频中的登录拥挤问题,导致无法登录,所以,我去gitee上从新找了个别人搞好点网易云的api接口【也是比较出名的那个,不想用不行啊,我也试过很多方法都不行】

接口详解网址:网易云音乐 NodeJS 版 API (binaryify.github.io)

查找接口网址:NeteaseCloudMusicApi

 然后选一个,用git clone,剩下的轻车熟路了,但是你需要有git,然后连接上gitee,或者你去github找一样

关键来了:

别杠哈!我试过手机号密码登录,手机号验证码登录,都没有用,邮箱我账号没有绑定就不用了,最后发现只有二维码登录才行,可能你会觉得二维码登录在小程序奇奇怪怪的,但是没有办法,现在只能这样了。

做了二维码登录及其页面效果和js,我还保留着手机号登录的页面样式和js,用swiper组件包裹着,ui样式,尚硅谷的太丑了,我修改了一下

以下是完整代码,可以copy下来,或者去我主页下载-资源包 login 部分

login.wxml

<swiper class="container">
  <swiper-item>
    <view class="title">
      <text>当前为二维码登录</text>
      <text>从右向左滑后,可进行手机号和密码登录</text>
    </view>
    <view class="qrLogin">
      <image src="{{qrDefault}}" mode="" class="qrImg" />
      <view class="qrStatus">二维码状态:<text>{{qrStatus}}</text></view>
      <button type="primary" bind:tap="handleQr">获取二维码</button>
    </view>
  </swiper-item>

  <swiper-item>
    <view class="title">
      <text>当前为手机号和密码登录</text>
      <text>从左向右滑后,可进行二维码登录</text>
    </view>
    <form class="input-content" catchsubmit="handleSubmit">
      <view class="input-item">
        <input type="number" id="number" bindfocus="handleFocus" bindblur="handleBlur" maxlength="11" name="number" />
        <label class="tit" for="number" style="{{tit1}}">请输入手机号</label>
      </view>
      <view class="input-item">
        <input type="text" password="true" id="password" bindfocus="handleFocus" bindblur="handleBlur" maxlength="16" name="password" />
        <label class="tit" for="password" style="{{tit2}}">请输入密码</label>
      </view>
      <button class="confirm-btn" form-type="submit">登 录</button>
    </form>

    <view class="forget-section">
      忘记密码?
    </view>

    <view class="register-section">
      还没有账号?
      <text>马上注册</text>
    </view>
  </swiper-item>

</swiper>

 login.wxss

/* pages/login/login.wxss */
.container {
  height: 100vh;
  color: #333333;
}

.container swiper-item {
  box-sizing: border-box;
  padding: 0 5%;
}

/*  */
.qrLogin {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.qrLogin image {
  width: 500rpx;
  height: 500rpx;
  border: 1rpx solid #979797;
  border-radius: 20rpx;
}

.qrLogin .qrStatus {
  margin: 10rpx 0 60rpx;
  color: #979797;
  font-size: 28rpx;
}

.qrStatus text {
  padding: 5rpx 15rpx;
  color: #edab3c;
  background-color: #fdf6ec;
  border: 1rpx solid #edab3c;
  border-radius: 7rpx;
  font-size: 25rpx;
  vertical-align: baseline;
}

/*  */
.title {
  display: flex;
  flex-direction: column;
  padding: 120rpx 0 80rpx;
  letter-spacing: 3rpx;
}

.title text:first-child {
  padding-bottom: 10rpx;
  font-weight: 600;
  font-size: 37rpx;
}

.title text:last-child {
  font-size: 26rpx;
  color: #979797;
}

.input-item {
  position: relative;
  margin-bottom: 70rpx;
  padding: 10rpx 5rpx;
  border-bottom: 1rpx solid #e0e0e0;
}

.input-item .tit {
  position: absolute;
  top: 10rpx;
  left: 10rpx;
  transition: all .2s linear
}

.confirm-btn {
  width: 100% !important;
  height: 84rpx;
  line-height: 84rpx;
  border-radius: 50rpx;
  background: #fc3a3a;
  color: #fff;
  font-size: 32rpx;
  padding: 0;
}

/*  */
.forget-section {
  font-size: 28rpx;
  color: #4399fc;
  text-align: center;
  margin-top: 40rpx;
}

/*  */
.register-section {
  position: absolute;
  left: 0;
  bottom: 50rpx;
  width: 100%;
  font-size: 28rpx;
  color: #606266;
  text-align: center;
}

.register-section text {
  color: #4399fc;
  margin-left: 10rpx;
}

login.js

// pages/login/login.js
import request from '../../utils/request'
Page({
  /**
   * 页面的初始数据
   */
  data: {
    // 做了个点击输入框,label移动的东西
    tit1: "",
    tit2: "",

    // 二维码状态
    qrDefault: 'https://img1.baidu.com/it/u=1629184190,3216022764&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500',
    qrStatus: "未获取",

    // 手机号登录
    number: "",
    password: ""
  },
  // 验证登录状态
  async getLoginStatus(cookie = '') {
    let userInfo = await request("/login/status", {
      cookie,
      timestamp: Date.now()
    })
    wx.setStorageSync('userInfo', JSON.stringify(userInfo.data.profile))
    wx.setStorageSync('cookie', JSON.stringify(cookie))
  },

  // 二维码相关 【都要加时间戳,防止缓存】
  async handleQr() {
    // 1、获取 key 
    let qrKey = await request("/login/qr/key", { timestamp: Date.now() })

    // 2、获取 二维码图片信息
    let qrCreate = await request("/login/qr/create", {
      key: qrKey.data.unikey,
      qrimg: true,
      timestamp: Date.now()
    })
    this.setData({
      qrDefault: qrCreate.data.qrimg,
      qrStatus: "当前已获取,等待扫码中"
    })

    // 3、扫描二维码
    let timer = setInterval(async () => {
      let qrCheck = await request("/login/qr/check", {
        key: qrKey.data.unikey,
        timestamp: Date.now()
      })

      // 判断扫码状态
      if (qrCheck.code === 800) {
        this.setData({
          qrStatus: '二维码已过期,请重新获取'
        })
        wx.showToast({
          title: '二维码已过期,请重新获取',
          icon: 'error'
        })
        clearInterval(timer)
        return;
      }
      if (qrCheck.code === 803) {
        // 这一步会返回cookie
        clearInterval(timer)

        await this.getLoginStatus(qrCheck.cookie);

        // 关闭所有页面,跳转到应用某页面,这样个人页在onLoad接受,只执行一次,不用再onshow 中执行多次
        wx.reLaunch({
          url: '/pages/personal/personal',
        })
      }
    }, 3000)
  },



  // 手机号登录相关
  handleFocus(e) {
    if (e.target.id == "number") {
      this.setData({
        tit1: "top:-30rpx; font-size:28rpx;"
      })
    } else if (e.target.id == "password") {
      this.setData({
        tit2: "top:-30rpx; font-size:28rpx;"
      })
    }
  },
  handleBlur(e) {
    // 内容为空,label位置就回去
    if (e.target.id == "number" && e.detail.value == "") {
      this.setData({
        tit1: ""
      })
    } else if (e.target.id == "password" && e.detail.value == "") {
      this.setData({
        tit2: ""
      })
    }
  },
  handleSubmit(e) {
    // console.log(e.detail.value); // {number: "11", password: "11"}
    let { number, password } = e.detail.value
    this.setData({
      number: number,
      password: password
    })

    /* 
      手机号验证
      1、空值;2、格式不正确;3、正确通过
    */
    if (!number) {
      wx.showToast({
        title: '手机号不能为空',
        icon: 'none'
      })
      // 因为是异步任务,后面代码没有必要去执行
      return;
    }
    // 定义正则表达式
    let phoneReg = /^1(3|4|5|6|7|8|9)\d{9}$/
    if (!phoneReg.test(number)) {
      wx.showToast({
        title: '手机号格式错误',
        icon: 'none'
      })
      return;
    }

    // 判断密码不能为空
    if (!password) {
      wx.showToast({
        title: '密码不能为空',
        icon: 'none'
      })
      return;
    }
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {

  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})

request.js和config.js

// request.js配置服务器信息
import config from './config'

export default (url, data = {}, method = "GET") => {
  return new Promise((resolve, reject) => {
    wx.request({
      url: config.host + url,
      data,
      method,
      success: (res) => {
        resolve(res.data)
      },
      fail: (err) => {
        reject(err)
      }
    })
  });
}


/* 
  config.js以后替换域名即可
*/
export default {
  host: "http://localhost:3000"
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux离线安装Telnet

前言&#xff1a;由于服务器部署在内网环境&#xff0c;不能yum安装 1.先从网站下载好我们所需要到的三个rpm包http://www.rpmfind.net/linux/rpm2html/search.php?queryxinetd&submitSearch...&system&arch image.png 三个依赖包分别是&#xff1a; -rw-r--r-- 1…

状态压缩 笔记

棋盘式的f[i][j]中表示状态的j可以是状态本身也可以是在合法状态state中的下标 用状态本身比较方便&#xff0c;用下标比较省空间 用下标的话可以开id[M]数组记录一下 蒙德里安的梦想 求把 NM的棋盘分割成若干个 12的长方形&#xff0c;有多少种方案。 例如当 N2&#xff0…

el-table动态合并

废话就不多说了&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; 合并行 // 方法一 <template><div class"container"><el-table :data"dataSource" :border"true":header-cell-style"{ font-weight: normal,…

Kafka常见生产问题详解

目录 生产环境常见问题分析 消息零丢失方案 1、生产者发消息到Broker不丢失 2、Broker端保存消息不丢失 3、消费者端防止异步处理丢失消息 消息积压如何处理 如何保证消息顺序 ​问题一、如何保证Producer发到Partition上的消息是有序的 问题二&#xff1a;Partition中…

深入解剖指针篇(2)

目录 指针的使用 strlen的模拟实现 传值调用和传址调用 数组名的理解 使用指针访问数组 一维数组传参的本质 冒泡排序 个人主页&#xff08;找往期文章&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 指针的使用 strlen的模拟实现 库函数strlen的功能是求字符串…

面试经典 150 题 -- 矩阵 (总结)

总的链接 : 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 36 . 有效的数独 模拟 : 用数组模拟哈希表来判断对应的行&#xff0c;列和当前元素所在的3*3方格中是否重复出现&#xff0c;是的话&#xff0c;直接return false…

基于C/C++的MFC的IDC_MFCEDITBROWSE2控件不显示ico问题记录

打开资源文件 *.rc文件 &#xff0c;在最上方添加 #if !defined(_AFXDLL) #include "afxribbon.rc" // MFC ribbon and control bar resources #endif 如下图所示&#xff1a;

【IC设计】Windows下基于IDEA的Chisel环境安装教程(图文并茂)

Chisel环境安装教程 第一步 安装jdk&#xff0c;配置环境变量第二步 安装sbt&#xff0c;不用配置环境变量第三步 安装idea社区版第四步 离线安装scala的idea插件第五步 配置sbt换源1.切换目录2.创建repositories文件3.配置sbtconfig.txt文件 第六步 使用chisel-tutorial工程运…

亚信安慧的AntDB数据库:稳定可靠的保障

亚信安慧AntDB数据库在运营商自主可控替换项目中的成功应用&#xff0c;具有极其重要的意义。该数据库的落地&#xff0c;不仅为这一项目注入了强大的支持力量&#xff0c;还在更大程度上提升了整体的运营效能。作为一种高效可靠的数据库解决方案&#xff0c;AntDB引入了先进的…

如何通过CVE漏洞编码找到对应的CVE漏洞详情及源码修改地址

背景&#xff1a; 最近正在使用docker进行一些cve漏洞的复现&#xff0c;有时候就要通过CVE的漏洞编码&#xff0c;找到对应的漏洞详情&#xff0c;以及漏洞的源码修改 以我上一篇文章的CVE-2020-17518编码为例 Apache Flink文件上Apache Flink文件上 方法&#xff1a; 通…

Mobileye CES 2024 自动驾驶新技术新方向

Mobileye亮相2024年国际消费类电子产品展览会推出什么自动驾驶新技术? Mobileye再次亮相CES&#xff0c;展示了我们的最新技术&#xff0c;并推出了Mobileye DXP--我们全新的驾驶体验平台。 与往年一样&#xff0c;Mobileye是拉斯维加斯展会现场的一大亮点&#xff0c;让参观…

bank conflict

前置知识&#xff1a; shared memory 被分成 32 个 bank一个 warp 32 个线程每个 bank 4 byte如果同一 warp 中不同线程访问同一 bank 的不同地址则发生 bank conflict 请注意需要是一个 warp 中的不同线程&#xff01;如果一个线程访问 shared memory 的两个元素&#xff0c;…

win11安装MySql5.7

1、下载 打开下载链接&#xff1a;MySQL :: Download MySQL Installer 2、安装 2.1、安装界面 2.2、选择自定义安装 2.3、根据自己系统的位数进行选择是X64还是X86 2.4、选择安装路径 2.5、继续下一步 2.6、选择服务器专用&#xff0c;端口是3306 2.7、设置密码 2.8、设置服…

数学建模 - 线性规划入门:Gurobi + python

在工程管理、经济管理、科学研究、军事作战训练及日常生产生活等众多领域中&#xff0c;人们常常会遇到各种优化问题。例如&#xff0c;在生产经营中&#xff0c;我们总是希望制定最优的生产计划&#xff0c;充分利用已有的人力、物力资源&#xff0c;获得最大的经济效益&#…

代码随想录 Leetcode77.组合

题目&#xff1a; 代码&#xff08;首刷看解析 2024年2月1日&#xff09;&#xff1a; class Solution { public:vector<vector<int>> res;vector<int> path;void backtracing(int n, int k, int startIndex) {if (path.size() k) {res.push_back(path);re…

【Linux C | I/O模型】Unix / Linux系统的5种IO模型 | 图文详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

嵌入式学习 Day16

一. 共用体 形式&#xff1a; union 共用体名 { 成员列表; //各个变量 }; //表示定义一个共用体类型 注意&#xff1a; 1.共用体 初始化 --- 只能给一个值&#xff0c;默认是给到第一个成员变量的 2.共用体成员变量 共用体用的数据最终存储的 --…

了解Ansible自动化运维工具及模块的使用

一、Ansible的相关知识 1.1 Ansible工具的了解 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。Ansible…

aspose-words基础功能演示

我们在Aspose.Words中使用术语“渲染”来描述将文档转换为文件格式或分页或具有页面概念的介质的过程。我们正在讨论将文档呈现为页面。下图显示了 Aspose.Words 中的渲染情况。 Aspose.Words 的渲染功能使您能够执行以下操作&#xff1a; 将文档或选定页面转换为 PDF、XPS、H…

gitlab操作手册

git操作篇 1. 项目克隆 git clone gitgitlab.test.cn:pro/project1.git2. 项目的提交 注&#xff1a;如果要查看文件的状态可以用git status命令&#xff1a; 如上图所示&#xff0c;文件已经修改了。 3. 项目的推送 git push origin feature/test01注&#xff1a;如果要查…