react+nodejs+腾讯云短信实现真实手机号验证码登录

react项目之真实手机号验证码登录

第一步如果你有腾讯云短信接口这一步可以直接省略,如果你没有请根据我的步骤进行申请“腾讯云短信接口

在这里插入图片描述

登录或者注册腾讯云账号

在这里插入图片描述

第三步去申请腾讯云提供的免费100条的短信

在这里插入图片描述

第四步创建一个签名

在这里插入图片描述

完成上述步骤,就可以开始使用了

现在是对后端nodejs的使用
nodejs版本最好在16以上,不然会报错
在下述代码中我写入了两个接口

//手机验证码
router.get('/sms', async function(req, res, next) {
  var temp = Math.random() * 9000; //[0,9000) 
  // 获取1000~9000
  temp = 1000 + parseInt(temp);
  
  let phone = req.query.phone;
  console.log(phone)
  // Depends on tencentcloud-sdk-nodejs version 4.0.3 or higher
  const tencentcloud = require("tencentcloud-sdk-nodejs-sms");

  const SmsClient = tencentcloud.sms.v20210111.Client;

  // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
  // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
  // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
  const clientConfig = {
      credential: {
          // 密钥id
          secretId: "自己的secretId",  //用于标识 API 调用者身份,可以简单类比为用户名。
          // 密钥密码
          secretKey: "自己的密匙", //用于验证 API 调用者的身份,可以简单类比为密码。
      },
      region: "ap-beijing",
      profile: {
          httpProfile: {
              endpoint: "sms.tencentcloudapi.com",
          },
      },
  };

  // 实例化要请求产品的client对象,clientProfile是可选的
  const client = new SmsClient(clientConfig);
  const params = {
      "PhoneNumberSet": ["+86"+phone],
      "SmsSdkAppId": "自己的SmsSdkAppId",
      "SignName": "自己的公众号名称",
      "TemplateId": "自己的TemplateId",
      "TemplateParamSet": [temp.toString()]
  };
  client.SendSms(params).then(
      (data) => {
          res.send({code:200,msg:"验证码发送成功",yanZhengMa:temp.toString(),data})
      },
      (err) => {
          console.error("error", err);
      }
  );
});


router.get('/yanlogin', async function(req, res, next) {
  console.log(123)
  let data=await usersModel.find({zhanghao:'13730401127'})
  if(data.length!==0){
    res.send({
      code:200,
      msg:"用户登录成功",
      data
    })
  }else{
    res.send({
      code:201,
      msg:"用户账号或者密码错误"
    })
  }
});

我们在创建签名的时候,你需要创建一个公众号或者小程序,不然无法进行申请。

前端react操作如下

在前端react中我创建了输入手机号页面和输入验证码页面
首先是手机号页面
后续则是验证码页面

下述是手机号页面

import axios from 'axios'
import React, { useState } from 'react'
import { Button, Input, Toast, Form } from 'react-vant'
import { useHistory } from 'react-router-dom'
import './yan.less'

export default () => {
  const history = useHistory(); // 获取history对象

const onFinish = (values) => {
  console.log(values);
};

const [phone, setPhone] = useState(''); // 手机号状态
const handlePhoneChange = (e) => {
  setPhone(e.target.value); // 更新手机号状态
};

const submit = async () => {
  try {
    const response = await axios.get(`http://localhost:3100/gyq/sms/?phone=${phone}`); // 发送获取验证码的请求
    const data = response.data; // 获取响应数据
    console.log(response);
    if (data.code === 200) { // 验证码发送成功
      Toast.success('验证码发送成功'); // 显示成功提示
      history.push('/需要跳转的验证码页面', { code: data.yanZhengMa }); // 跳转到glogin页面,并传递验证码参数
    } else {
      Toast.fail('有错误'); // 请求失败,显示错误提示
    }
  } catch (error) {
    Toast.fail('网络请求失败'); // 网络请求失败,显示错误提示
    console.error(error);
  }
};

  return (
    <div className='yan_main'>
      <img src={require('../../public/images/444.png')} />
      <div className='yan_ma'>
      <Form
      onFinish={onFinish}
      footer={
        <div style={{ margin: '16px 16px 0' }}>
          <Button round nativeType='submit' type='primary' onClick={submit} block>
            发送
          </Button>
        </div>
      }
    >
      <Form.Item
        name='text1'
        label='手机号'
        rules={[{ pattern: /\d{11}/, message: '请输入11位手机号' }]}
      >
        <Input placeholder='请输入您的手机号' onBlur={handlePhoneChange} />
      </Form.Item>
    </Form>
      </div>
        
    </div>
    
  )
}

下述是验证码页面

import React, { useEffect, useState } from 'react';
import { ArrowLeft } from '@react-vant/icons';
import { useHistory, useLocation } from 'umi';
import { NumberKeyboard, PasscodeInput, Space } from 'antd-mobile';
import axios from 'axios';

const Code = (props) => {
  const [time, usetime] = useState(60); // 倒计时时间状态
  const [flag, useflag] = useState(true); // 倒计时标志状态
  const location = useLocation();  // 获取当前页面路由信息
  const { code } = location.query; // 获取路由参数中的code
  const history = useHistory(); // useHistory用于进行路由跳转

  useEffect(() => {
    let timer = 60; // 初始倒计时时间为60秒
  
    // 创建定时器,每隔1秒更新倒计时时间
    const interval = setInterval(() => {
      timer--;
      usetime(timer); // 更新倒计时时间状态
  
      if (timer <= 0) {
        clearInterval(interval); // 当倒计时时间归零时,清除定时器
        useflag(false); // 更新倒计时标志状态为false,表示倒计时结束
      }
    }, 1000);
  
    // 组件卸载时清除定时器
    return () => {
      clearInterval(interval);
    };
  }, []);
  

  const fanhui = () => {
    history.goBack(); // 返回上一页
  };

  const sub = (e) => {
    axios.get("http://localhost:3100/gyq/yanlogin").then((val) => {
      console.log(val); // 打印返回的响应数据
      sessionStorage.setItem("token", JSON.stringify(val.data.data[0])); // 将响应数据中的第一个数据项存储到sessionStorage中
      alert('验证码输入成功'); // 弹出提示框,表示验证码输入成功
      history.push('/index/home'); // 跳转到首页
    });
  };
  

  return (
    <div id="code">
      <div className='top'>
        <div>
          <ArrowLeft style={{ marginTop: "30px" }} fontSize="20px" onClick={() => fanhui()} />
        </div>
        <p>
          验  证  码  登  录
        </p>
      </div>
      <div className='con'>
        <div className='title'>请输入验证码</div>
        <div className='info'>验证码已发送至 +86 {props.phone ? props.phone.slice(0, 3) + '****' + props.phone.slice(8) : ''}</div>
        <div className='box'>
          <PasscodeInput length={4} plain keyboard={<NumberKeyboard />} onFill={(e) => sub(e)} />
        </div>
        <div className='daojishi'>{flag ? `${time}s后重新获取验证码` : ''}</div>
      </div>
    </div>
  );
};

export default Code;

到这里也就结束了,记得点赞哦
在这里插入图片描述

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
基于React和Node的云课堂系统设计与实现如下: 设计方案: 1.前端部分使用React进行开发,通过组件化的方式搭建系统各个页面,包括学生和教师的登录页面、课程列表页面、课程详情页面等。前端使用React的虚拟DOM和状态管理机制,提高页面渲染效率和用户交互体验。 2.后端部分使用Node作为服务器端语言,搭建服务端应用,提供数据接口和业务逻辑处理。使用Express框架处理HTTP请求,通过路由控制不同请求的处理逻辑。同时,使用MongoDB数据库存储用户信息、课程信息等。 3.系统采用前后端分离的架构,前后端通过接口进行数据交互。前端发送请求到后端获取数据,后端经过处理后返回相应的数据给前端进行展示。 实现步骤: 1.创建React项目,搭建基本的项目架构和路由配置,实现用户登录页面和注册页面。 2.在后端使用Express创建服务器,配置路由,实现用户注册和登录接口,将用户信息存储在MongoDB中。 3.开发课程列表页面,通过前端请求后端接口获取课程列表数据,并进行展示。 4.实现课程详情页面,通过前端发送请求获取具体的课程详情数据,包括课程名称、教师信息、课程介绍等。 5.开发学生选课功能,前端通过请求后端接口获取可选课程列表,用户选择后将选课信息存储到数据库中。 6.开发教师端功能,教师可以管理课程信息,包括创建课程、编辑课程、删除课程等。 7.完善系统功能,如学生查看已选课程、教师查看已开课程等。 总结: 基于React和Node的云课堂系统设计与实现需要充分发挥React的组件化和状态管理特性,同时利用Node的高效处理请求和Express的简洁路由配置,通过前后端分离架构实现系统的功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值