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

一、发送消息

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

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

  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. [翻译svg教程]svg学习系列 开篇

    目录 [翻译svg教程]svg学习系列 开篇 [翻译svg教程 ]svg 的坐标系统 [翻译svg教程]svg 中的g元素 [翻译svg教程]svg中矩形元素 rect [翻译svg教程]svg中的c ...

  2. compass typography 排版 常用排版方法[Sass和compass学习笔记]

    Bullets 用来定义ul li 相关的样式 no-bullet  关闭 li的默认样式 那个小圆点 no-bullets 作用域ul 调用no-bullet 函数 不过用了reset 后 默认没有 ...

  3. 使用git把项目提交到github

    1.需要在https://github.com/注册一个账户 2.注册成功后,新建一个repository,用来存放你要上传的项目,如下图所示 这里你需要输入你的项目的名称,可以对你的项目进行描述,如 ...

  4. _MSC_VER详细介绍

    _MSC_VER详细介绍 转自:http://www.cnblogs.com/braver/articles/2064817.html _MSC_VER是微软的预编译控制. _MSC_VER可以分解为 ...

  5. java分享第二十天(build.xml的语法及写法)

    通常情况下,Ant构建文件build.xml应该在项目的基础目录.可以自由使用其他文件名或将构建文件中其他位置.在本练习中,创建一个名为build.xml 在电脑的任何地方的文件. <?xml ...

  6. Windows下ADT环境搭建

    1.JDK安装 下载JDK(点我下载),安装成功后在我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量: JAVA_HOME值为C:\Program Files ...

  7. ubuntu环境下vmware取消自动启动服务

    概述其实vmware这个服务取不取消,影响不大,主要是我有强迫症,在不用虚拟机的时候,看着vmware占着进程真心不爽,想要解决这个问题,在用虚拟机的时候启动服务,反之,则停.接下来,我说一下实现吧. ...

  8. java学习中的一些疑惑解答

    一.java中的枚举类型: 在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的.例如星期一到星期日七个数据元素 ...

  9. sscanf_强大的数据读取-转换

    function <cstdio> sscanf int sscanf ( const char * s, const char * format, ...); Read formatte ...

  10. ES6(五) 数组扩展

    Array.of方法用于将一组值,转换为数组.  Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES ...