2401_83940696 2024-07-23 17:42 采纳率: 2.1%
浏览 5
已结题

为什么不能获得验证码?

以下是我的代码,我想利用阿里云短信和ajax实现在前端页面点击按钮后给手机发送验证码,但为什么没有反应并且按钮也不会出现一分钟倒数
前端代码

<html>
<head>
    <meta http-equiv="content-type" content="text/html;
    charset=UTF-8">
    <meta name="viewport" content="width=device-width,
    initial-scale=1, maximum-scale=1,user-scalable=no">
    <title>注册</title>
    {% load static %}
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css'%}">
    <link rel="stylesheet" href="{% static 'plugins/font-awesome-4.7.0/css/font-awesome.css'%}">
    <link rel="stylesheet"
          href="{% static 'plugins/bootstrap-datetimepicker-master/css/bootstrap-datetimepicker.min.css'%}">

</head>
<body>
<div class="account">
    <h2 style="text-align:center;">用户注册</h2>
    <form id="regForm" method="POST" style="margin-top:20px;" novalidate>
        {% csrf_token %}
        {% for field in form %}
        {% if field.name == 'code' %}
        <div class="form-group" style="margin-top:20px;">
            <label> {{ field.label}}</label>
            <div class="clearfix">
                <div class="col-md-6" style="padding:0;">{{field}}</div>
                <div class="col-md-6"><input id="btnSms" type="button" class="btn btn-default" value="点击获取验证码"></div>
            </div>
            <span class="error-msg" style="color:red;position:absolute"></span>
        </div>
        {% else %}
        <div class="form-group" style="margin-top:20px;">
            <label> {{ field.label}}</label>
            {{field}}
            <span class="error-msg" style="color:red;position:absolute"></span>
            {% endif %}
            {%endfor%}
            <div>
                <input id="btnSubmit" style="height:35px;width:200px; margin-left:90px; font-size:17px;" type="button" value="注册"
                       class="btn btn-info">
            </div>
            <div>
                 <span style="float: right; margin-top:20px;">已有账号.<a style=" text-decoration:none;" href=" ">去登录</a ></span>
            </div>
        </div>
    </form>

</div>

<script src="{% static 'js/jquery-3.5.1/jquery-3.5.1.min.js'%}"></script>
<script>
    //页面加载完
 $(function(){
        bindClickBtnSms();
        });

    //点击获取验证码的按钮绑定事件
        function bindClickBtnSms(){
            $('#btnSms').click(function(){

            $(".error-msg").empty();

            //获取用户输入的手机号
            var mobile=$('#id_mobile').val();

            $.ajax({
                url:"/send/sms/",
                type:"GET",
                data:{mobile: mobile,tpl: "register"},
                dataType: 'json',
                success:function(res){
                    //ajax请求发送成功后,自动执行函数
                    if (res.status){
                        sendSmsRemind();
                    }else{
                        //错误信息
                        $.each(res.error,function(key,value){
                            $('#id_'+key).next().text(value[0]);
                            })
                        }
                    },
                     error:function(xhr,status,error){
                        console.log('ajax请求失败:'+error)}
                })
            })
        }
        //倒计时
        function sendSmsRemind() {
            var $smsBtn=$('#smsBtn');
            $smsBtn.prop('disabled',true);  //禁用
            var time =60;
            var remind=setInterval(function (){
                $smsBtn.val(time + '秒重新发送');
                time=time-1;
                if (time<1){
                    clearInterval(remind);
                    $smsBtn.val('点击获取验证码').prop('disabled',false);
                }
            },1000)
        }
</script>
</body>
</html>


后端代码

def create_client(access_key_id, access_key_secret):
    config = open_api_models.Config(
        access_key_id=access_key_id,
        access_key_secret=access_key_secret
    )
    config.endpoint = f'dysmsapi.aliyuncs.com'
    return Dysmsapi20170525Client(config)


def send_sms(request):
    """发送短信"""
    from library.utils.forms import SendSmsForm
    form = SendSmsForm(request, data=request.GET)
    # 校验手机号,不能为空
    if form.is_valid():
        return JsonResponse({'status': True})
    return JsonResponse({'status': False, 'error': form.errors})
class SendSmsForm(forms.Form):
    code = random.randrange(100000, 999999)
    mobile = forms.CharField(label="手机号",
                             validators=[RegexValidator(r'^(1[3|4|5|6|7|8|9])\d{9}$', '手机号格式错误'), ])

    def __init__(self, request, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.request = request

    def clean_mobile(self):
        """手机号校验的勾子"""
        mobile = self.cleaned_data['mobile']
        # 判断短信模板是否有问题
        tpl = self.request.GET.get('tpl')
        template_id = settings.ALIYUN_SMS_TEMPLATE.get(tpl)
        if not template_id:
            raise ValidationError("短信模板错误")
        # 校验数据库中是否已有手机号
        exist = Username.objects.filter(mobile=mobile).exists()
        if exist:
            raise forms.ValidationError('手机号已存在')

        # 发短信 & 写redis
        code = random.randrange(100000, 999999)
        send_sms(mobile, template_id, '{"code":"' + str(code) + '"}')


        return mobile
def send_sms(phone_num, template_code, template_param):
    client = create_client('LTAI5tBxR8DkU1BKW39QsiLK', 'TEjXlIqcV31dBwwW8gHqUA6xVSr4DO')
    send_sms_request = dysmsapi_20170525_models.SendSmsRequest(
        sign_name='Python图书管理',
        template_code=template_code,
        phone_numbers=phone_num,
        template_param=template_param
    )
    runtime = util_models.RuntimeOptions()
    try:
        response = client.send_sms_with_options(send_sms_request, runtime)
        return response
    except Exception as error:
        UtilClient.assert_as_string(error.message)
        return {'result': 1000, 'errmsg': "短信发送失败"}

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2024-07-23 17:43
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    根据你提供的代码和问题描述,我们可以逐步分析并尝试解决你的问题。

    问题1: 前端页面点击获取验证码按钮后没有反应

    1. 检查Ajax请求:首先,确保你的Ajax请求能够正确发送。检查url, type, data等参数是否正确配置。你的Ajax请求中url参数是"/send/sms/",确保这个URL是正确的,并且后端有对应的路由处理。

    2. 检查后端响应:Ajax请求成功后,需要检查后端的响应。如果后端返回{'status': True},前端应该执行sendSmsRemind()函数来实现倒计时效果。如果后端返回错误信息,前端应该显示相应的错误信息。

    3. 检查错误处理:在Ajax请求的error回调函数中,使用console.log打印错误信息,以便于调试。

    问题2: 按钮没有出现一分钟倒数的效果

    1. 检查倒计时函数:在sendSmsRemind函数中,你使用了变量$smsBtn,但是在你的代码中并没有定义这个变量,而是使用了$('#btnSms')。你需要将$smsBtn改为$('#btnSms')

    2. 修复倒计时逻辑:确保倒计时逻辑正确,按钮在倒计时期间应该被禁用,并且在倒计时结束后应该恢复正常。

    具体修复步骤

    1. 修复Ajax请求:确保Ajax请求的URL和数据格式正确。

    2. 修复倒计时逻辑

      function sendSmsRemind() {
          var $btnSms = $('#btnSms'); // 修复变量名
          $btnSms.prop('disabled', true); // 禁用按钮
          var time = 60;
          var remind = setInterval(function() {
              $btnSms.val(time + '秒重新发送');
              time = time - 1;
              if (time < 1) {
                  clearInterval(remind);
                  $btnSms.val('点击获取验证码').prop('disabled', false);
              }
          }, 1000);
      }
      
    3. 增加错误处理

      error: function(xhr, status, error) {
          console.log('ajax请求失败:' + error);
          // 可以在这里显示错误信息给用户
      }
      
    4. 使用开发者工具:使用浏览器的开发者工具(如Chrome的DevTools)检查网络请求,确保请求被正确发出,并且后端返回了预期的响应。

    5. 后端代码检查:确保后端代码能够正确处理请求,并且调用阿里云短信服务的API是正确的。检查是否有异常被捕获并且正确处理。

    通过上述步骤,你应该能够解决前端点击无反应和倒计时不出现的问题。如果问题仍然存在,可能需要进一步检查代码逻辑和后端服务的配置。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月23日
  • 创建了问题 7月23日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?