实现注册手机号用户

1、使用Post异步发送请求(发送短信),离焦事件触发时判断

	<script src="layer/layer.js"></script>
	<!--离焦事件-->
	<script type="text/javascript" th:inline="javascript">
	$("#username").blur(function(){
		//判断用户名谁否符合手机号的格式,正则
		if(/^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$/.test($("#username").val())){
			//如果符合,发短信,$.post  (ajax)
			var telephone = $("#username").val()
			$.post(
				//url  给/sendSMS权限放行
				[[@{~/sendSMS}]],
				//参数
				{"telephone":telephone},
				//回调函数
				function(data){
					alert("success")
				},
				//数据格式
				"json"
			)
		}
		else{
			//不符合,给出提示信息
			layer.msg("手机号格式有误!!")
		}
	})
	
	$("#repassword").blur(function(){
		alert("repassword")
	})
	
	$("#SMS").blur(function(){
		alert("SMS")
	})
	</script>
package com.zzz.blog.controller;

import ...

@Controller
public class VisitorController {

	//ajax
	@RequestMapping("/sendSMS")
	@ResponseBody 
	public String sendSMS(String telephone) {
		//给手机号发信息
		System.out.println(telephone);
		return "";
	}
	
}

2、发送手机验证码(使用腾讯云短信服务,注册方法搜索之前文章)

复制qcloudsms-1.0.5.jar到工程bin文件夹下,并build path一下。
修改sendSMS方法

//ajax 给手机号发信息
	@RequestMapping("/sendSMS")
	@ResponseBody 
	public String sendSMS(String telephone,HttpSession session) {
		
		//appid  appkey
		int appid =  xxx;
		String appkey = "xxx";
		//短信模板id
		int templateId = xxx;
		//签名的名字
		String smsSign = "玄尺软件编程公众号";
		
		//给谁发
		String phoneNumber = telephone;
		//验证码
		String[] params = new String[1];
		Random r = new Random();
		String code = "";
		for(int i=0;i<4;i++) {
			code += r.nextInt(10);
		}
		//放入session域中
		session.setAttribute("SMS", code);
		params[0] = code;
		
		SmsSingleSender sender = new SmsSingleSender(appid, appkey);
		//地区、电话、模板id、验证码、签名
			SmsSingleSenderResult result;
			try {
				result = sender.sendWithParam("86", phoneNumber, templateId, params, smsSign, "", "");
				System.out.println(result);
			} catch (HTTPException | JSONException | IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		
		return "";
	}

3、判断手机号是否已存在

@Controller
public class VisitorController {

	@Autowired
	private VisitorService visitorService;
	
	//ajax 给手机号发信息
	@RequestMapping("/sendSMS")
	@ResponseBody 
	public String sendSMS(String telephone,HttpSession session) {
		//判断数据库是否存在该手机号
		//存在,不发送短信
		String json = null;
		if (visitorService.findVisitorByUsername(telephone) != null) {
			json = "{\"message\":"+false+"}";
		} 
		//不存在,发送短信
		else {
			json = "{\"message\":"+true+"}";
			SMS(telephone, session);
		}
		
		return json;
	}
	
	public void SMS(String telephone,HttpSession session) {
		//appid  appkey
		int appid =  xxx;
		String appkey = "xxx";
		//短信模板id
		int templateId = xxx;
		//签名的名字
		String smsSign = "玄尺软件编程公众号";
		
		//给谁发
		String phoneNumber = telephone;
		//验证码
		String[] params = new String[1];
		Random r = new Random();
		String code = "";
		for(int i=0;i<4;i++) {
			code += r.nextInt(10);
		}
		//放入session域中
		session.setAttribute("SMS", code);
		params[0] = code;
		
		SmsSingleSender sender = new SmsSingleSender(appid, appkey);
		//地区、电话、模板id、验证码、签名
		SmsSingleSenderResult result;
		try {
			result = sender.sendWithParam("86", phoneNumber, templateId, params, smsSign, "", "");
			System.out.println(result);
		} catch (HTTPException | JSONException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}
package com.zzz.blog.service;

import ...
@Service
public interface VisitorService {

	Visitor saveVisitory(Visitor visitor);

	Visitor findVisitorByUsername(String telephone);

}
package com.zzz.blog.service;

import ...

@Component
public class VisitorServiceImpl implements VisitorService{

	@Autowired
	private VisitorRepository visitorRepository;
	
	@Override
	public Visitor saveVisitory(Visitor visitor) {
		return visitorRepository.save(visitor);
	}

	@Override
	public Visitor findVisitorByUsername(String telephone) {
		return visitorRepository.findVisitorByUsername(telephone);
	}

}
package com.zzz.blog.repository;

import ...

public interface VisitorRepository extends CrudRepository<Visitor, Long>{

	@Query(value = "select * from visitor where username = ?1",nativeQuery = true)
	Visitor findVisitorByUsername(String telephone);

}
	<script type="text/javascript" th:inline="javascript">
	$("#errorMessage").hide();
	...
				//回调函数
				function(data){
					if(data.message){
						$("#errorMessage").hide();
						layer.msg("手机验证码已发送,请注意查收!!")
					}
					else{
						$("#errorMessage").show(); //在前面先调用先隐藏错误信息
						$("#errorMessage").html("该手机号已经被注册!!");
					}
				},
	...

4、测试发送短信以及用户名是否重复

测试发送短信成功以后,把验证码发送代码注释掉(因为发送短信需要收费)

		System.out.println(code);
		
//		SmsSingleSender sender = new SmsSingleSender(appid, appkey);
//		//地区、电话、模板id、验证码、签名
//		SmsSingleSenderResult result;
//		try {
//			result = sender.sendWithParam("86", phoneNumber, templateId, params, smsSign, "", "");
//			System.out.println(result);
//		} catch (HTTPException | JSONException | IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}

在visitor表中插入一条手机号用户数据,测试用户重复情况下的提示信息,测试通过。

5、判断两次密码是否一致

	$("#repassword").blur(function(){
		//判断两次密码是否一致
		if($("#password").val() != $("#repassword").val()){
			$("#errorMessage").show();
			$("#errorMessage").html("两次密码输入不一致!!");
		}
		else{
			$("#errorMessage").hide();
		}
	})

6、测试判断手机验证码的正确性

	$("#SMS").blur(function(){
		var sms = $("#SMS").val();
		$.post(
			//url  在securityconfig中给权限放行
			[[@{~/judgeSMS}]],
			//传参
			{"smsCode":sms},
			//回调参数
			function(data){
				if(data.message){
					$("#errorMessage").hide();
					layer.msg("验证码正确!!")
				}
				else{
					$("#errorMessage").show();
					$("#errorMessage").html("验证码错误!!");
				}
			},
			//数据格式
			"json"
		)
	})
//在VisitorController中添加判断方法
	@RequestMapping("/judgeSMS")
	@ResponseBody
	public String judgeSMS(String smsCode,HttpSession session) {
		String codeInSession = (String)session.getAttribute("SMS");
		
		String json = null;
		if (smsCode.equals(codeInSession)) {
			json = "{\"message\":"+true+"}";
		} else {
			json = "{\"message\":"+false+"}";
		}
		
		return json;
	}

7、防止皮的用户注册提交错误的表单

...
<form id="visitorRegisterForm" th:action="@{~/registerVisitor}" class="login100-form validate-form">
...
<button onclick="submitButton()" type="button" class="login100-form-btn">注 册</button>
...
	<!--离焦事件-->
	<script type="text/javascript" th:inline="javascript">
	$("#errorMessage").hide();
	var isOkUsername,isOkPassword,isOkSMS;	
	//在每个离焦事件中第一句赋初值为false,在判断正确的逻辑里改值为true
	...
	
	function submitButton(){
		//防止皮的用户在输入有错误内容的时候注册
		if(isOkUsername==false){
			$("#errorMessage").show();
			$("#errorMessage").html("用户名重复或格式错误!!");
		}
		else if(isOkPassword==false){
			$("#errorMessage").show();
			$("#errorMessage").html("两次密码输入不一致!!");
		}
		else if(isOkSMS==false){
			$("#errorMessage").show();
			$("#errorMessage").html("验证码错误!!");
		}
		else{
			$("#visitorRegisterForm").submit()
		}
	}		
	</script>
...

8、完成注册功能

	@RequestMapping("/registerVisitor")  //权限放行
	public String registerVisitor(Visitor visitor) {
		Random r = new Random();
		int random = r.nextInt(8) + 1;
		visitor.setImage("/images/1-"+random+".jpg");
		
		visitorService.saveVisitory(visitor);
		
		return "redirect:/visitorLogin";
	}

测试:输入内容,点击注册按钮,数据库中正确添加数据即可。