手机号获取验证码进行登录注册

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

使用容联云获取验证码,进行用户登录+注册,获取手机验证码使用异步,使用token。


提示:以下是本篇文章正文内容,下面案例可供参考

一、准备工作

1、创建django项目,进行mysql数据库配置,导入创建的app,并在django项目中创建utils目录,在此目录下创建config.py文件用于存储短信验证码,并创建test_celery.py文件写入异步

config.py

# 消息中间人broker设置
broker_url = 'redis://:123456@127.0.0.1:6379/15' #不能写localhost
# 结果存储设置
backend_result_url = 'redis://:123456@127.0.0.1:6379/16'

broker 是代理人,它负责分发任务给 worker 去执行。我使用的是 Redis 作为 broker。没有设置 CELERY_RESULT_BACKEND,默认没有配置,此时 Django 会使用默认的数据库(也是你指定的 orm 数据库)。

test_celery.py

from celery import Celery
from django.conf import settings
import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day0.settings')

app = Celery('day0')

app.config_from_object('utils3.config')

app.autodiscover_tasks(settings.INSTALLED_APPS)

关于异步详细参考官方文档 链接:link

2、访问容联云网站: 链接:link
  1. 获取自己的accID、accToken、appID
3、参考官方 Pyhon SDK文档:链接:link
from ronglian_sms_sdk import SmsSDK

accId = '容联云通讯分配的主账号ID'
accToken = '容联云通讯分配的主账号TOKEN'
appId = '容联云通讯分配的应用ID'

def send_message():
    sdk = SmsSDK(accId, accToken, appId)
    tid = '容联云通讯创建的模板ID'
    mobile = '手机号1,手机号2'
    datas = ('变量1', '变量2')
    resp = sdk.sendMessage(tid, mobile, datas)
    print(resp)

在utils中创建sms_code.py文件,写入SDK

from ronglian_sms_sdk import SmsSDK
import random
import redis
from utils.test_celery import app

accId = '填写自己的ACCOUNT SID'
accToken = '填写自己的AUTH TOKEN'
appId = '填写自己的AppID'


@app.task
def send_message(mobile):
    sdk = SmsSDK(accId, accToken, appId)
    tid = '1'
    data = random.randint(100000, 999999)
    cls = redis.Redis(host='localhost', port=6379, password='123456')
    cls.set('sms%s' % mobile, data, ex=300)
    datas = (data, '5')
    resp = sdk.sendMessage(tid, mobile, datas)
    print(resp)
    return resp

@app.task为异步

4、Token
  1. 在utils文件夹中创建my_jwt.py文件
  2. 写入代码
import jwt
from django.conf import settings


def generate_jwt(payload):
    token = jwt.encode(payload=payload, key=settings.SECRET_KEY)
    return token
5、模型类创建
class User(models.Model):
    mobile = models.CharField(max_length=11, verbose_name='手机号码')

    class Meta:
        db_table = 'day0920_user'
        verbose_name_plural = '手机验证码登录'

    def __str__(self):
        return self.mobile

二、后端接口创建

1.在views中导入需要的模块
from rest_framework.views import APIView
from rest_framework.response import Response
from day0920.models import User
from utils.sms_code import send_message
from utils.my_jwt import generate_jwt
import redis
2.获取验证码接口
class GetSMSCodeView(APIView):
    def get(self, request):
        mobile = request.query_params.get('mobile')
        send_message(mobile)
        return Response({
            'code': 200,
            'msg': '验证码发送成功'
        })
3.用户登录接口
class LoginUser(APIView):
    def post(self, request):
        mobile = request.data.get('mobile')
        smscode = request.data.get('smscode')
        if not all([mobile, smscode]):  # 校验前端传来数据的完整性
            return Response({
                'code': 400,
                'msg': '请输入账号或验证码'
            })
        cls = redis.Redis(host='127.0.0.1', port=6379, password='123456')
        redid_data = cls.get('sms%s' % mobile)  # 从redis中获取验证码
        if not redid_data:
            return Response({
                'code': 400,
                'msg': '验证码已过期'
            })
        if redid_data.decode('utf-8') != smscode:   # 将存入redis中的验证码转码与前端数据进行比较
            return Response({
                'code': 400,
                'msg': '验证码错误'
            })
        try:
            # 此时数据库中有此用户,直接登录
            User.objects.get(mobile=mobile)
            data_ = {
                'name': mobile
            }
            token = generate_jwt(data_)
            return Response({
                'code': 200,
                'msg': '登陆成功',
                'token': token
            })
        except Exception as e:
            # 数据库中无此用户,进行注册登录
            User.objects.create(mobile=mobile)
            data_ = {
                'name': mobile
            }
            token = generate_jwt(data_)
            return Response({
                'code': 201,
                'msg': '登陆成功',
                'token': token
            })
4.路由创建
  1. 主路由
"""day0 URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('day/', include('day0920.urls'))
]

2.在app中创建接口的子路由

from django.urls import path
from .views import *
urlpatterns = [
    path('get_sms_code/', GetSMSCodeViews.as_view()),
    path('login_user/', LoginUser.as_view())
]

三.在vue中添加接口

1.前端准备工作

1.创建vue2项目
2.下载axios与elment-ui
3.elment-ui官方文档link

2.登录窗口
<template>
  <div>
    <table align="center">
      <tr>
        <td><h1>欢迎登陆</h1></td>
      </tr>
      <tr>
        <td>
          <el-input placeholder="请输入手机号" v-model="mobile"></el-input>
        </td>
      </tr>
      <tr>
        <td>
          <el-input placeholder="请输入验证码" v-model="smscode"
            ><el-button
              style="padding-right: 10px"
              slot="suffix"
              type="text"
              @click="getsms"
              >获取验证码</el-button
            ></el-input
          >
        </td>
      </tr>
      <tr>
        <td><el-button @click="login">登录</el-button></td>
      </tr>
    </table>
  </div>
</template>

在这里插入图片描述

3.验证码获取
getsms() {
      this.$axios
        .get("/day/get_sms_code/", {
          params: { mobile: this.mobile },
        })
        .then((result) => {
          console.log(result);
          if (result.data.code == 200) {
            this.$message(result.data.msg);
          }
        })
        .catch((err) => {
          console.log(err);
        });
    }
4.登录
login() {
      this.$axios
        .post("/day/login_user/", {
          mobile: this.mobile,
          smscode: this.smscode,
        })
        .then((result) => {
          console.log(result);
          if (result.data.code == 201 || result.data.code == 200) {
            this.$message(result.data.msg);
          } else if (result.data.code == 400) {
            this.$message(result.data.msg);
          }
        })
        .catch((err) => {
          console.log(err);
        });
    }

四.实践测试

1.输入手机号码

在这里插入图片描述

2.点击获取验证码

在这里插入图片描述

此时后端接收的验证码

在这里插入图片描述

手机接收的验证码

在这里插入图片描述

点击登录

在这里插入图片描述

此时后端提示为200,因为这个手机号码登陆过,所以是已存在直接登录

在这里插入图片描述

mysql数据库

在这里插入图片描述

此时更换新手机号进行注册登录

在这里插入图片描述

后端接收的验证码

在这里插入图片描述

因为此手机号没有在容联云中添加测试号码,所以不会以短信形式发送

在这里插入图片描述

提示201,表示以注册并登录,此时数据库

在这里插入图片描述

总结

  1. 创建前后端项目
  2. 后端项目中写入容联云SDK、异步、Token
  3. 创建模型
  4. 编写获取验证码与登录接口
  5. 前端编写登录模板
  6. 获取手机号验证码按钮与登录按钮绑定点击事件并写入后端接口
  7. 完成测试
  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一些测试用例示例,用于测试手机号获取验证码的功能: 1. 测试有效手机号码能否成功获取验证码: - 输入:有效的手机号码(例如:13812345678) - 预期输出:成功获取验证码,并返回验证码信息。 2. 测试无效手机号码是否能够正确处理: - 输入:无效的手机号码(例如:12345678901) - 预期输出:返回错误提示信息,提示手机号码无效。 3. 测试手机号码为空时是否能够正确处理: - 输入:空的手机号码 - 预期输出:返回错误提示信息,提示手机号码不能为空。 4. 测试已被注册手机号码是否能够正确处理: - 输入:已被注册手机号码(例如:已经在系统中注册过的手机号码) - 预期输出:返回错误提示信息,提示手机号码已被注册。 5. 测试短信验证码是否正确生成: - 输入:有效的手机号码 - 预期输出:成功获取验证码,并返回正确的验证码信息。 6. 测试验证码有效期是否正确: - 输入:有效的手机号码 - 预期输出:成功获取验证码,并检查验证码的有效期是否符合要求。 7. 测试频繁获取验证码是否正确限制: - 输入:在短时间内多次连续获取验证码 - 预期输出:检查系统是否正确限制了频繁获取验证码的操作,并返回相应的错误提示信息。 这些测试用例覆盖了常见的手机号获取验证码的情况,可以帮助你确保该功能的正确性和稳定性。根据具体的系统要求和业务逻辑,你可以进一步扩展和调整这些测试用例。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值