微信小程序(四十六)登入界面-进阶版

news2024/11/15 19:37:31

注释很详细,直接上代码

上一篇

此文使用了vant组件库,没有安装配置的可以参考此篇vant组件的安装与配置

新增内容:
1.手机号与验证码格式验证
2.验证码的网络申请和校验

wechat-http模块在好几篇以前已经讲了咋安装的,不记得的友友自己从我的专栏里找一下


这里相较于上一篇需要安装模块wechat-validate
终端输入npm install wechat-validate

在这里插入图片描述
安装成功以后不要忘记构建npm

在这里插入图片描述

出现xxx不在以下 request 合法域名列表中报错的看这篇
微信小程序:xxx不在以下 request 合法域名列表中

源码:

app.json

{
  "usingComponents": {
    "van-field": "@vant/weapp/field/index",
    "van-count-down": "@vant/weapp/count-down/index",
    "van-button": "@vant/weapp/button/index"
  },
  "pages": [
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window": {
    "navigationBarTextStyle": "black",
    "navigationBarTitleText": "Weixin",
    "navigationBarBackgroundColor": "#ffffff"
  },
  "componentFramework": "glass-easel",
  "sitemapLocation": "sitemap.json",
  "lazyCodeLoading": "requiredComponents"
}

app.js

App({
 globalData:{//定义全局变量
    token:wx.getStorageSync('token')//如此实现token初始化从内存中读取,也可以用下面注释的内容进行初始化
 },
//  onLaunch: function () {
//   // 在 onLaunch 生命周期回调函数中获取本地存储中的 token 值
//   const token = wx.getStorageSync('token');
 
//   if (token) {
//     this.globalData.token = token;
//     console.log("0."+this.globalData.token)
//   } else {
   
//     // 如果本地存储中不存在 token 的值,可以设置一个默认值或采取其他处理方式
//     this.globalData.token = '';
//   }
// }
})

index.wxml

<view class="login-header">
  <view class="label">用户登入</view>
</view>
<view class="login-form">
  <van-cell-group>
  <!--  1.type 控制弹出手机键盘的类型
        2.maxlength 控制最大长度
        3.use-slot 使用插槽
        4.placeholder-style 占位内容样式
        5.model:value 双向绑定
   -->
    <van-field model:value="{{mobile}}" placeholder="请输入手机号码" type="number" maxlength="{{11}}" use-slot placeholder-style="color: #999999;">
      <!-- slot在官方文档里面有几个特定的类型,可以自己找来康康 -->
      <view wx:if="{{!countDownVisble}}" slot="button">
        <van-button size="small" type="primary" bind:tap="sendCode">
          发送验证码
        </van-button>
      </view>
      <!-- 稍微调整一下文字位置 -->
      <view slot="right-icon" wx:else style="margin-top: -20rpx;">
        <!-- 倒计时组件 -->
        <!-- 
          1. time计时时常单位毫秒
          2.bind:change时间变化触发
         -->
        <van-count-down use-slot time="{{60*1000}}" bind:change="countDownChange">
          <text style="color: #999999; ">
            {{timeData.seconds}}秒后重新获取
          </text>
        </van-count-down>
      </view>
    </van-field>

    <van-field model:value="{{code}}" placeholder="请输入6位数验证码" maxlength="{{6}}" placeholder-style="color:#999999" />
  </van-cell-group>

  <view class="login-tip">未注册的手机号验证后将自动注册</view>
</view>

<!-- 在行内写样式,如果在css文件里要提高权值才行 -->
<button size="mini" style="margin:30rpx 0 0 300rpx; background-color: palegreen; padding: 0 50rpx;" bind:tap="onSubmit">登入</button>

index.wxss

.label{
  font: 1em SimHei;
  font-size: 50rpx;
  margin: 60rpx 0 50rpx 30rpx;
}

.login-tip{
  margin: 20rpx 0 90rpx 30rpx;
  color: #dadada;
  font-size: 27rpx;
}

index.js

//导入http包
const { default: http } = require("wechat-http")

// 在页面或组件中导入表单验证
import validate from 'wechat-validate'

//设置基本网站地址
http.baseURL='https://live-api.itheima.net'

Page({
  // 通过 behaviors 注入 validate 方法
  behaviors: [validate],

  data:{
    countDownVisble:false,//是否显示倒计时
    timeData: {},//时间数据
    mobile:'',//用于输入框手机号双向绑定
    code:''//用于输入框验证码双向绑定
  },
   // 定义表单数据的验证规则
   rules: {
    mobile: [
      // required 是否要求必填,message 未填提醒
      { required: true, message: '请填写手机号码!' },
      //pattern 正则校验,message 格式不符提醒
      { pattern: /^1[3-9]\d{9}$/, message: '请检查手机号码是否正确!' },
    ],
    code: [
      { required: true, message: '请填写短信验证码!' },
      { pattern: /^\d{6}$/, message: '请检查短信验证码是否正确!' }
    ]
  },
  //发送验证码(自带一个加载提示框)
  async sendCode(){
    //校验电话号码
    const {valid,message}=this.validate('mobile')

    //校验成功
    if(valid){
      this.setData({
        countDownVisble:true//出现倒计时
      })

      //发出post网络请求(上传手机号)
      const res=await http.get('/code',{mobile:this.data.mobile})

      //在控制台打印返回的验证码(因为这只是虚拟的验证码所以并不是通过短信返回)
      console.log("验证码为:"+res.data.data.code)
  }else{//电话号码验证失败
    wx.showToast({
      title:message,//按之前设定的规则出现提示
      icon:'none'
    })
  }
  },

  //验证验证码
  async onSubmit(){
    //校验短信验证码格式
    const {valid,message}=this.validate('code')
    //校验成功
    if(valid){
    //解析获取数据
    const  {mobile,code}=this.data

    //上传手机号和验证码进行验证
    const res= await http.post('/login',{mobile,code})
    //console.log(res.data.code)
    //验证成功
    if(res.data.code===10000){
      const app=getApp()
      //console.log('1.'+app.globalData.token)
      app.globalData.token=res.data.data.token
      //console.log('2.'+app.globalData.token)
      wx.setStorageSync('token', app.globalData.token)
      wx.showToast({
        title: '登入成功!',
        icon:"none"
      })
      //跳转到log页面(模拟一下登入成功后的跳转)
      wx.redirectTo({
        url:'/pages/logs/logs'
      })
    }
    else{//这里其实也可以用拦截器,拦截器之前示范过了,这里为方便手动判断一下
      wx.showToast({
        title: '验证码错误!',
        icon:"none"
      })
    }
    }
    else{
      wx.showToast({
        title:message,
        icon:'none'
      })
    }
  },
  //倒计时变化
  countDownChange(ev){
    //console.log(ev)
    this.setData({
      //倒计时组件数据
      timeData:ev.detail,
      //倒计时是否显示判断
      countDownVisble:ev.detail.minutes===1||ev.detail.seconds>0
    })
  }
})

效果演示:(这里会有意演示一下格式不标准会导致的情况)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

检查链表是否有环,返回值为bool和从头节点进入环的第一个节点两种情况

题目1&#xff08;不返回节点&#xff09; 给定单链表&#xff0c;检查链表是否有环。 代码实现&#xff1a; bool IsCircle(List plist) {assert(plist ! NULL);if (plist NULL||plist->nextNULL)return false;Node* p plist->next;//慢指针,一次走一步Node* q pl…

Mysql-主从架构篇(一主多从,半同步案例搭建)

主从架构 主从架构有什么用&#xff1f; 通过搭建MySQL主从集群&#xff0c;可以缓解MySQL的数据存储以及访问的压力。 数据安全&#xff08;主备&#xff09;&#xff1a;给主服务增加一个数据备份。基于这个目的&#xff0c;可以搭建主从架构&#xff0c;或者也可以基于主…

00x集—二维轻量多线段LWpolyline设置凸度bulge——vba实现

本文主要讲LightweightPolyline ,即轻量多段线。 LightweightPolyline (每一顶点用2个元素表示,数组大小必须为2的倍数)对象, 而对比polyline(每一顶点用三个元素表示,数组大小必须为3的倍数) 优化多段线&#xff08;轻量多段线&#xff09;&#xff0c;由线和弧段组成的可调节…

第三十周:文献阅读

第三十周&#xff1a;综述阅读文献阅读pytorch学习 摘要Abstract1. 深度可分离卷积1.1 文献摘要1.2 引言1.3 Inception 模块1.4 Inception模块与深度可分离卷积的差别1.5 Xception架构1.6 实验1.7 总结1.8 创新点 摘要 深度可分离卷积是一种卷积神经网络&#xff08;CNN&#…

【Linux】线程概念|线程理解|线程控制

文章目录 线程概念Linux中线程是否存在的讨论线程创建和线程控制线程的终止和等待&#xff08;三种终止方式 pthread_join()的void**retval&#xff09; 线程概念 线程就是进程内部的一个执行流&#xff0c;线程在进程内运行&#xff0c;线程在进程的地址空间内运行&#xff0…

【c++】继承深度解剖

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么事继承&#xff0c;基类和派生类的使用和…

启动CMD/powershell命令窗口时,设置默认的python虚拟环境 in window10

启动CMD/powershell命令窗口时&#xff0c;设置默认的python虚拟环境 in window10 本文有两个目的&#xff1a; CMD命令窗口&#xff0c; 设置默认启动的python环境PowerShell命令窗口&#xff0c; 设置默认启动的python环境 CMD命令窗口&#xff0c; 设置默认启动的python环…

企业计算机服务器中了360勒索病毒如何解密,360后缀勒索病毒处理流程

对于众多的企业来说&#xff0c;企业的数据是企业发展的核心&#xff0c;越来越多的企业开始注重企业的数据安全问题&#xff0c;但随着网络技术的不断发展与应用&#xff0c;网络黑客的攻击加密手段也在不断升级。近期&#xff0c;云天数据恢复中心接到多家企业的求助&#xf…

PDN分析及应用系列二-简单5V电源分配-Altium Designer仿真分析-AD

PDN分析及应用系列二 —— 案例1:简单5V电源分配 预模拟DC网络识别 当最初为PCB设计打开PDN分析仪时,它将尝试根据公共电源网络命名法从设计中识别所有直流电源网络。 正确的DC网络识别对于获得最准确的模拟结果非常重要。 在示例项目中已经识别出主DC网络以简化该过程。 …

人工智能之Tensorflow程序结构

TensorFlow作为分布式机器学习平台&#xff0c;主要架构如下&#xff1a; 网络层&#xff1a;远程过程调用(gRPC)和远程直接数据存取(RDMA)作为网络层&#xff0c;主要负责传递神经网络算法参数。 设备层&#xff1a;CPU、GPU等设备&#xff0c;主要负责神经网络算法中具体的运…

【旧文搬运】为你的 Laravel 应用添加一个基于 Swoole 的 WebSocket 服务

做了一个基于 Swoole 的 WebSocket 扩展包&#xff0c;可以用来做实时状态推送&#xff0c;或者自定义消息处理实现 im&#xff0c;有需要的可以看看: [giorgio-socket] 使用方法 安装 安装扩展包 composer require wu/giorgio-socket发布配置文件 php artisan vendor:pu…

可莉炸鱼

情况有s*k>n&#xff0c;最多炸鱼数为n s*k<n&#xff0c;最多炸鱼数为s*k 将s*k转化为k个s相加&#xff0c;每次结果与n比较 #include<iostream> #include<vector> #include<algorithm> using namespace std; #define endl \n #define ll long lon…

Java---文件,流✨❤️

文章目录 1.遍历文件夹2.遍历子文件夹3.练习流4.以字节流的形式读取文件内容5.以字节流的形式向文件写入数据顶折纠问6 .写入数据到文件 1.遍历文件夹 一般说来操作系统都会安装在C盘&#xff0c;所以会有一个 C:\WINDOWS目录。 遍历这个目录下所有的文件(不用遍历子目录) 找出…

pyqt5怎么返回错误信息给页面(警告窗口)

在软件设计中&#xff0c;我们可能会遇到对异常的处理&#xff0c;有些异常是用户需要看到的&#xff0c;比如说&#xff0c;当我们登录出错的时候&#xff0c;后端需要给我们返回响应的错误信息&#xff0c;就像下图实现的这样。 类似这种效果&#xff0c;我们该如何实现&…

选择何种操作系统作为网站服务器

选择操作系统时&#xff0c;需考虑稳定性、安全性、成本、兼容性和技术支持等因素&#xff0c;常见选项有Windows Server和Linux发行版。 选择网站服务器的操作系统是一个关键的决策&#xff0c;因为它将影响到网站的性能、稳定性、安全性以及未来的扩展性&#xff0c;目前市场…

ES向量功能实战:向量搜索

1 缘起 项目需要&#xff0c;向量搜索使用ES&#xff0c;为了顺利使项目顺利交付&#xff0c;开始学习ES的稠密向量功能&#xff0c;本文即ES向量的实践&#xff1a;增删查改。ES从7.x版本支持向量功能&#xff0c;为测试ES向量功能&#xff0c;需要使用7.x及以上的版本。本文…

算法刷题day20:二分

目录 引言概念一、借教室二、分巧克力三、管道四、技能升级五、冶炼金属六、数的范围七、最佳牛围栏 引言 这几天一直在做二分的题&#xff0c;都是上了难度的题目&#xff0c;本来以为自己的二分水平已经非常熟悉了&#xff0c;没想到还是糊涂了一两天才重新想清楚&#xff0…

vue3 vite项目一运行就401(Unauthorized)

问题&#xff1a;项目一执行&#xff1a; pnpm run dev, 启动就出错&#xff0c; Failed to load resource: the server responded with a status of 401 (Unauthorized) 分析&#xff1a; 项目之前是正常运行的&#xff0c;没有问题&#xff0c;回溯刚刚改动&#xff0c;还原…

W5300驱动说明

W5300是一款带有硬件协议栈的网络芯片&#xff0c;内部拥有128K的缓存&#xff0c;最大支持8路socket通信&#xff0c;与MCU之间通过16位数据总线通信&#xff0c;通信速度远超W5500之类以SPI作为通信接口的网络芯片&#xff0c;特别适合对高速网络传输有需求的应用。 本次使用…

基于springboot+vue的疫苗发布和接种预约系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…