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

一、发送消息

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

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

  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. SqlServer性能检测和优化工具使用详细

    工具概要 如果你的数据库应用系统中,存在有大量表,视图,索引,触发器,函数,存储过程,sql语句等等,又性能低下,而苦逼的你又要对其优化,那么你该怎么办?哥教你,首先你要知道问题出在哪里?如果想知道问 ...

  2. C#删除文件

    string file =System.Web.HttpContext.Current.Server.MapPath(fileUrl); if (System.IO.File.Exists(file) ...

  3. 写一个将当前页面 URL 中的 get 参数解析成一个对象的方法。

    function getQuery () { var args = {}; var query = window.location.search.substring(1); var pairs = q ...

  4. python numpy基础 数组和矢量计算

    在python 中有时候我们用数组操作数据可以极大的提升数据的处理效率, 类似于R的向量化操作,是的数据的操作趋于简单化,在python 中是使用numpy模块可以进行数组和矢量计算. 下面来看下简单 ...

  5. php微信扫码支付

    一 概述 扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信"扫一扫"完成支付的模式.该模式适用于PC网站支付.实体店单品或订单支付.媒体广告支付等场景.前几天公司需要做 ...

  6. linux,无法进行写操作怎么办?read-only file system

    一句命令搞定: mount -o remount rw /

  7. HBase原理和架构

    HBase是什么 HBase在生态体系中的位置 HBase vs HDFS HBase表的特点 HBase是真正的分布式存储,存储级别达到TB级别,而才传统数据库就不是真正的分布式了,传统数据库在底层 ...

  8. 第八篇:Jmeter的分布式测试

    一: 由于Jmeter本身的瓶颈,当模拟数以千计的用户并发的时候,使用单台机器会有些力不从心,甚至还会引起Java内存溢出的错误,要解决这个问题,就要使用分布式测试,运行多台机器,也就是所谓的Agen ...

  9. db2

    关于3种导入导出操作进行简单的介绍:export:导出数据,支持IXF,DEL或WSFimport:导入数据,可以向表中导入数据,支持上面提到的4种文件类型.    load:导入数据,功能和impo ...

  10. 准确计算Java中对象的大小

    由于在项目中需要大致计算一下对象的内存占用率(Hadoop中的Reduce端内存占用居高不下却又无法解释),因此深入学习了一下如何准确计算对象的大小. 使用system.gc()和java.lang. ...