最近做一个项目,因为涉及到注册,因此需要发送短信,一般发送短信都有一个倒计时的小按钮,因此,就做了一个,在此做个记录。

一、发送消息

  没有调用公司的短信平台,只是模拟前台生成一串数字,将此串数字输出一下。

  在这个部分写了两个类文件:一个是生成随机数,一个是模拟发送此数字的。

  1、因为生成几位随机数,是必须要到项目上线之前才能定的,因此,写了一个带参数的函数,如下

    /// <summary>
/// 生成随机验证码
/// </summary>
public static class RandomCode
{
/// <summary>
/// 返回一个N位验证码
/// </summary>
/// <param name="N">位数</param>
/// <returns></returns>
public static string RandomCodeCommand(int N)
{
string code = "";
Random random = new Random();
for (int i = ; i < N; i++)
{
code += random.Next();
}
return code;
}
}

RandomCode

  2、模拟发送此串数字。

  这个类里面用了两个Timer函数,一个是用作Button的倒数显示的,另一个是用作保存这个验证码时长的。

  在记录验证码的同时,还需要记录发送验证码的手机号,以防止,用户用第一个手机号点击了发送验证码后,把手机号部分修改为其他的手机号。

public class SendRandomCode : ViewModelBase
{
private int _interval;//记录倒计时长
private string idCode;//在规定时间内保存验证码
private int idCodeTime;//设置验证码的有效时间(秒)
private int idCodeNum = ;//设置验证码的位数 public void GetCode(string phoneNum)
{
//获取验证码
timerSend = new Timer();
timerSend.AutoReset = true;
timerSend.Elapsed += Timer_Elapsed;
_interval = SecondNum;
timerSend.Start(); //在验证码有效期内,再次请求验证码,需要先关闭上一次的
if (timerTime != null)
{
timerTime.Close();
timerTime.Dispose();
}
//验证码的有效期
timerTime = new Timer();
timerTime.AutoReset = true;
timerTime.Elapsed += TimerTime_Elapsed;
timerTime.Start();
idCodeTime = SaveTime;
IdCode = RandomCode.RandomCodeCommand(idCodeNum);
PhoneNum = phoneNum;
} #region 获取验证码倒计时
Timer timerSend;
Timer timerTime;
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
BtnIsEnable = false;
BtnContent = "(" + (_interval--) + ")秒后再次获取验证码"; if (_interval <= -)
{
BtnIsEnable = true;
BtnContent = "获取验证码";
timerSend.Stop();
timerSend.Dispose();
}
//throw new NotImplementedException();
}
private void TimerTime_Elapsed(object sender, ElapsedEventArgs e)
{
idCodeTime--;
if (idCodeTime <= )
{
IdCode = "";
timerTime.Stop();
timerTime.Dispose();
}
Console.WriteLine(IdCode);
//throw new NotImplementedException();
}
#endregion #region 字段
//*************************************************************************************************//上线时需要修改
private int secondNum = ;//设置倒计时长
private int saveTime = ;//设置保存验证码时长
//*************************************************************************************************//
private string btnContent = "获取验证码";//设置获取验证码按钮显示的名称
private bool btnIsEnable = true;//设置获取验证码按钮是否可用 private string phoneNum;//记录是否是发送验证码的手机号
public int SecondNum
{
get
{
return secondNum;
} set
{
secondNum = value;
}
} public int SaveTime
{
get
{
return saveTime;
} set
{
saveTime = value;
}
} public string BtnContent
{
get
{
return btnContent;
} set
{
btnContent = value;
RaisePropertyChanged("BtnContent");
}
} public bool BtnIsEnable
{
get
{
return btnIsEnable;
} set
{
btnIsEnable = value;
RaisePropertyChanged("BtnIsEnable");
}
} public string IdCode
{
get
{
return idCode;
} set
{
idCode = value;
RaisePropertyChanged("IdCode");
}
} public string PhoneNum
{
get
{
return phoneNum;
} set
{
phoneNum = value;
RaisePropertyChanged("PhoneNum");
}
}
#endregion
}

SendRandomCode

二、XAML页面代码

<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal">
<Label Content="手机号"/>
<TextBox Text="{Binding PhoneNum}" Height="20" Width="100"/>
<Button Content="{Binding Src.BtnContent}" IsEnabled="{Binding Src.BtnIsEnable}" Command="{Binding SendCode}" Height="20" Width="120"/>
</StackPanel>
<StackPanel Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal">
<Label Content="验证码"/>
<TextBox Text="{Binding IdentifyCode}" Height="20" Width="100"/>
<Button Content="提交" Command="{Binding Submit}" Height="20" Width="120"/>
</StackPanel>
</Grid>

XAML

三、VM页面代码  

  VM页面没有什么特别的,就是声明了一些字段,

  特别注意的是,由于前台的XAML页面上的发送短信按钮是需要倒计时的,因此Button的Content和IsEnable需要绑定到SendRandomCode这个类上,所以需要在VM下声明一下这个类

public class BingVM: ViewModelBase
{
#region 界面字段
private string phoneNum;//手机号
private string identifyCode;//验证码
public string PhoneNum
{
get
{
return phoneNum;
} set
{
phoneNum = value;
RaisePropertyChanged("PhoneNum");
}
} public string IdentifyCode
{
get
{
return identifyCode;
} set
{
identifyCode = value;
RaisePropertyChanged("IdentifyCode");
}
}
#endregion #region 为获取验证码按钮设置content和isEnable用的
SendRandomCode src = new SendRandomCode();
public SendRandomCode Src
{
get { return src; }
set
{
src = value;
}
}
#endregion private RelayCommand sendCode;//获取验证码 public RelayCommand SendCode
{
get
{
return sendCode ?? (sendCode = new RelayCommand(
() =>
{
if (!string.IsNullOrEmpty(PhoneNum))
{
src.GetCode(PhoneNum);
}
else
{
MessageBox.Show("手机号不能为空!");
} }));
}
}
private RelayCommand submit; public RelayCommand Submit
{
get
{
return submit ?? (submit = new RelayCommand(
() =>
{
if (IdentifyCode == src.IdCode && PhoneNum == src.PhoneNum)
{
MessageBox.Show("验证成功");
}
else
{
MessageBox.Show("验证失败");
}
}));
}
} }

VM

四、效果展示

上面是成功的效果图

验证失败的情况如下:

1、如果在发送验证码的过程中,把手机号修改了,填入原有的验证码

2、如果输入的验证码不是程序输出的验证码

3、时间超过了验证码的保存时间

=============================================================================

BUG修复:

刚才在测试的过程中发现了一个问题,由于我们做的主程序是调用模块的DLL文件生成磁贴的,而主程序的返回按钮,不会关闭掉当前磁贴的所有线程,导致当返回再进入此磁贴时,再次点击发送按钮,则会再次出现一个验证码,解决方式很简单:修改SendRandomCode代码,在Timer timerTime;前加static,是其成为静态的。这样再次点击时,就是知道线程已存在,先关闭再发送。

WPF MVVM下做发送短信小按钮的更多相关文章

  1. React实战之60s倒计时按钮(发送短信验证按钮)

    React实战之60s倒计时按钮——短信验证按钮 导入:(antd组件——Form表单) import { Button, Form, Input } from 'antd'; const FormI ...

  2. Yii2发送短信验证码完全解决方案

    概述 在做项目的时候,需要用到短信发送验证码功能.不能不说Yii2的牛逼,很容易就搞定了.下面我整理一下具体功能和流程,分享给大家. 主要功能 通过Yii2 rules验证手机号 通过js验证是否为手 ...

  3. 个人永久性免费-Excel催化剂功能第85波-灵活便捷的批量发送短信功能(使用腾讯云接口)

    微信时代的今天,短信一样不可缺席,大系统都有集成短信接口.若只是临时用一下,若能够直接在Excel上加工好内容就可以直接发送,这些假设在此篇批量群发短信功能中都为大家带来完美答案. 业务场景 不多说, ...

  4. 如何让HTML在手机上实现直接拨打电话以及发送短信?

    拨打电话的HTML实现方式: <a href="tel:134289210xx″>拨打电话</a> 上面是比较常用的方式,但是有可能在某些场景下是支持不太好,可以试用 ...

  5. 如何使用微信小程序云函数发送短信验证码

    其实微信小程序前端和云端都是可以调用短信平台接口发送短信的,使用云端云函数的好处是无需配置域名,也没有个数限制. 本文使用的是榛子云短信平台(http://smsow.zhenzikj.com) ,S ...

  6. phoneGap的Android下编写phonegap 发送短信插件

    一.前端代码的编写 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  7. android 发送短信 怎样做到一条一条的发送,仅仅有在上一条发送成功之后才发送下一条短信

    android发送短信截获上一条发送是否成功,然后再来发送下一条短信 1.问题:在项目中遇到例如以下要求:待发短信有N条,实现一条一条的发送并在上一条短信发送成功之后再来发送下一条. for(int ...

  8. 微信小程序发送短信验证码完整实例

    微信小程序注册完整实例,发送短信验证码,带60秒倒计时功能,无需服务器端.效果图: 代码: index.wxml <!--index.wxml--> <view class=&quo ...

  9. 微信小程序如何发送短信验证码,无需搭建服务器

    自从微信小程序提供云开发支持,开发者无需搭建后台服务器,使用微信提供的核心API就可以实现应用功能,此时就需要小程序能够自己发送短信,比如短信验证码,榛子云短信(http://smsow.zhenzi ...

随机推荐

  1. 使EditText不要在页面打开时自动获取焦点(因为软键盘会自动弹出)

    当页面上有EditText时,第一个EditText会在页面打开时自动的获取焦点,这样带来的问题就是系统键盘会自动的弹出来. 解决方法比较简单只要为EditText的父控件设置一下就行了: andro ...

  2. UVALive-4839 HDU-3686 Traffic Real Time Query System 题解

    题目大意: 有一张无向连通图,问从一条边走到另一条边必定要经过的点有几个. 思路: 先用tarjan将双连通分量都并起来,剩下的再将割点独立出来,建成一棵树,之后记录每个点到根有几个割点,再用RMQ求 ...

  3. [BZOJ1106][POI2007] Tet 立方体大作战

    Description 一个叫做立方体大作战的游戏风靡整个Byteotia.这个游戏的规则是相当复杂的,所以我们只介绍他的简单规则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置.这些元素拥有n个 ...

  4. Python3.5 day3作业二:修改haproxy配置文件。

    需求: 1.使python具体增删查的功能. haproxy的配置文件. global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 lo ...

  5. sql 存储过程 output参数的使用

    /*嵌套存储过程中需要输出来的参数*/output 就是这个存储过程返回的值 也可以说输出的值--创建存储过程 求最大值CREATE PROCEDURE [dbo].[P_Max]@a int, -- ...

  6. Jquery.load() 使用

    调用load方法的完整格式是:load( url, [data], [callback] ) url:是指要导入文件的地址. data:可选参数:因为Load不仅仅可以导入静态的html文件,还可以导 ...

  7. Sql判断不为Null也不为空的写法

    看到不少人写: isnull(field,'')<>'' 其中这样写最经济实惠:field>''

  8. Angularjs ng-if和ng-show的区别

    ng-if:判断条件,为true时向html中插入节点,否则从html中移除节点: ng-show: 简单的显示和隐藏(display) 坑点:ng-if会创建一个新的作用域(scope),如果内部元 ...

  9. https://oj.leetcode.com/problems/majority-element/

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  10. Java中有关Null的9件事

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常 (NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我 ...