品优购13——用户注册

1. 工程搭建

1.1 服务层

1)接口工程pinyougou-user-interface(jar)

2)服务工程pinyougou-user-service(war)

3)引入相关依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.pinyougou</groupId>
    <artifactId>pinyougou-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>pinyougou-user-service</artifactId>
  <packaging>war</packaging>
  
  <dependencies>
  <!-- Spring -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>		
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-beans</artifactId>		
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>		
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-jdbc</artifactId>		
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-aspects</artifactId>		
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-jms</artifactId>		
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context-support</artifactId>		
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-test</artifactId>		
	</dependency>
	<!-- dubbo相关 -->
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>dubbo</artifactId>	
	</dependency>
	<dependency>
		<groupId>org.apache.zookeeper</groupId>
		<artifactId>zookeeper</artifactId>	
	</dependency>
	<dependency>
		<groupId>com.github.sgroschupf</groupId>
		<artifactId>zkclient</artifactId>		
	</dependency>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>		
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>		
	</dependency>
	<dependency>
		<groupId>javassist</groupId>
		<artifactId>javassist</artifactId>		
	</dependency>
	<dependency>
	    <groupId>commons-codec</groupId>
	    <artifactId>commons-codec</artifactId>	   
	</dependency>
	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>servlet-api</artifactId>		
		<scope>provided</scope>
	</dependency>

	<dependency>
		<groupId>com.pinyougou</groupId>
		<artifactId>pinyougou-user-interface</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</dependency>
	<dependency>
		<groupId>com.pinyougou</groupId>
		<artifactId>pinyougou-common</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</dependency>
	<dependency>
		<groupId>com.pinyougou</groupId>
		<artifactId>pinyougou-dao</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</dependency>
	
	<!-- ActiveMQ -->
	<dependency>
		<groupId>org.apache.activemq</groupId>
		<artifactId>activemq-client</artifactId>
		<version>5.13.4</version>
	 </dependency>
	
  </dependencies>
  
  <build>  
	  <plugins>	     
	      <plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<!-- 指定端口 -->
					<port>9006</port>
					<!-- 请求路径 -->
					<path>/</path>
				</configuration>
	  	  </plugin>
	  </plugins>  
    </build>
  
</project>

4)编写添加用户方法add

/**
 * 增加
 */
@Override
public void add(TbUser user) {
	// 添加附加属性
	user.setCreated(new Date());
	user.setUpdated(new Date());
	user.setPassword(DigestUtils.md5Hex(user.getPassword()));
	user.setSourceType("1");
	userMapper.insert(user);		
}

1.2 Controller层

1)创建war工程  pinyougou-user-web 我们将注册功能放入此工程

2)添加web.xml 

3)引入依赖pinyougou-user-interface 、spring相关依赖,tomcat运行端口9106

4)添加spring配置文件

5)拷贝静态原型页面register.html 及相关资源

1.3 前端

1.3.1 controller层代码

 //控制层 
app.controller('userController' ,function($scope,$controller   ,userService){	
	
	$scope.reg = function() {
		
		// 进行密码判断
		if($scope.password != $scope.entity.password){
			
			alert("两次密码输入不一致!");
			$scope.password = "";
			$scope.entity.password = "";
		}
		
		userService.add($scope.entity).success(function(response) {
			if(response.success){
				alert("注册成功!");
			} else {
				alert("注册失败!");
			}
		});
		
	}
	
});	

1.3.2 service层代码

//增加 
this.add=function(entity){
	return  $http.post('../user/add.do',entity );
}

1.3.3 前台界面

1)js文件引入

2)指令添加

3)数据绑定

基本的框架功能就走通了。

2. 注册判断短信验证码

        点击页面上的”获取短信验证码”连接,向后端传递手机号。后端随机生成6位数字作为短信验证码,将其保存在redis中(手机号作为KEY),并发送到短信网关。
        用户注册时,后端根据手机号查询redis中的验证码与用户填写的验证码是否相同,如果不同则提示用户不能注册。

2.1 生成验证码

1)在pinyougou-user-service工程的UserServiceImpl中添加方法

@Override
public void genSmsCode(final String phone) {
	// 手机验证码是6位数字
	long random = (long) (Math.random() * 1000000);
	final String smsCode = random + "";
	// System.out.println(smsCode);
	// 保存到redis
	redisTemplate.boundHashOps("smsCode").put(phone, smsCode);
	
	// 发送短信
	jmsTemplate.send(queueSmsDestination, new MessageCreator() {
		@Override
		public Message createMessage(Session session) throws JMSException {
			MapMessage mapMessage = session.createMapMessage();
			mapMessage.setString("mobile", phone);//手机号
			mapMessage.setString("template_code", template_code);//模板编号
			mapMessage.setString("sign_name", sign_name);//签名				
			Map m=new HashMap<>();
			m.put("number", smsCode);				
			mapMessage.setString("param", JSON.toJSONString(m));//参数

			return mapMessage;
		}
	});
}

2)在 pinyougou-common  添加工具类PhoneFormatCheckUtils.java,用于验证手机号

package util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class PhoneFormatCheckUtils {

    /** 
     * 大陆号码或香港号码均可 
     */  
    public static boolean isPhoneLegal(String str)throws PatternSyntaxException {  
        return isChinaPhoneLegal(str) || isHKPhoneLegal(str);  
    }  
  
    /** 
     * 大陆手机号码11位数,匹配格式:前三位固定格式+后8位任意数 
     * 此方法中前三位格式有: 
     * 13+任意数 
     * 15+除4的任意数 
     * 18+除1和4的任意数 
     * 17+除9的任意数 
     * 147 
     */  
    public static boolean isChinaPhoneLegal(String str) throws PatternSyntaxException {  
        String regExp = "^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$";  
        Pattern p = Pattern.compile(regExp);  
        Matcher m = p.matcher(str);  
        return m.matches();  
    }  
  
    /** 
     * 香港手机号码8位数,5|6|8|9开头+7位任意数 
     */  
    public static boolean isHKPhoneLegal(String str)throws PatternSyntaxException {  
        String regExp = "^(5|6|8|9)\\d{7}$";  
        Pattern p = Pattern.compile(regExp);  
        Matcher m = p.matcher(str);  
        return m.matches();  
    }  
	
}

3)修改pinyougou-user-web的UserController.java

@RequestMapping("/genSmsCode")
public Result genSmsCode(String phone){
	try {
		
		// 验证手机号码是否合法
		if(!PhoneFormatCheckUtils.isPhoneLegal(phone)){
			return new Result(false, "手机号非法!");
		}
		
		userService.genSmsCode(phone);
		return new Result(true, "发送成功!");
	} catch (Exception e) {
		System.out.println("获取短信验证码失败!");
		e.printStackTrace();
		return new Result(false, "发送失败!");
	}
}

4)修改pinyougou-user-web的userService.js

this.genSmsCode = function(phone) {
	return $http.get('../user/genSmsCode.do?phone='+phone);
}

5)pinyougou-user-web的userController.js

// 生成验证码
$scope.genSmsCode = function() {
	userService.genSmsCode($scope.entity.phone).success(function(response){
		if(response.success){
			alert("短信发送成功!");
		} else{
			alert(response.message);
		}
	});
}

6)修改页面register.html

2.2 用户注册验证码判断

1)修改pinyougou-user-service的 UserServiceImpl.java

@Override
public boolean checkSmsCode(String phone,String code) {
	
	Object object = redisTemplate.boundHashOps("smsCode").get(phone);
	if(null == object){
		return false;
	}
	String rediscode = (String)object;
	if(!rediscode.equals(code)){
		return false;
	}
	return true;
}

2)修改pinyougou-user-web的UserController.java

/**
 * 增加
 * @param user
 * @return
 */
@RequestMapping("/add")
public Result add(@RequestBody TbUser user,String code){
	try {
		// 添加之前判断验证码是否正确
		if(!userService.checkSmsCode(user.getPhone(), code)){
			return new Result(false, "验证码不正确!");
		}
		// 添加之前,再次校验手机号
		if(!PhoneFormatCheckUtils.isPhoneLegal(user.getPhone())){
			return new Result(false, "手机号非法!");
		}
		userService.add(user);
		return new Result(true, "增加成功");
	} catch (Exception e) {
		e.printStackTrace();
		return new Result(false, "增加失败");
	}
}

3)修改pinyougou-user-web的userService.js

//增加 
this.add=function(entity,code){
	return  $http.post('../user/add.do?code='+code,entity );
}

4)修改pinyougou-portal-web 的UserController.java

$scope.reg = function() {
	
	// 进行密码判断
	if($scope.password != $scope.entity.password){
		
		alert("两次密码输入不一致!");
		$scope.password = "";
		$scope.entity.password = "";
	}
	
	userService.add($scope.entity,$scope.code).success(function(response) {
		if(response.success){
			alert("注册成功!");
		} else {
			alert(response.message);
		}
	});
	
}

5)页面绑定变量

2.3 通过短信微服务发送短信

1)在pinyougou-user-service添加配置文件applicationContext-activemq.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amq="http://activemq.apache.org/schema/core"
	xmlns:jms="http://www.springframework.org/schema/jms"
	xsi:schemaLocation="http://www.springframework.org/schema/beans   
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context   
		http://www.springframework.org/schema/context/spring-context.xsd">
		
	
	<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    	<constructor-arg index="0" value="admin"/>
    	<constructor-arg index="1" value="admin"/>
    	<constructor-arg index="2" value="tcp://192.168.25.130:61616"/>
    	<property name="useAsyncSend" value="true"></property>
    	<property name="clientID" value="prodUser"></property>
    </bean>
		<!--new  add  begin-->
	<bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
		<property name="targetConnectionFactory" ref="connectionFactory"/>
		<property name="sessionCacheSize" value="100" />
	</bean>
		
		   
    <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->  
	<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
	    <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  
	    <property name="connectionFactory" ref="cachingConnectionFactory"/>  
	</bean>      
	
    <!-- 注入队列对象  这个是队列目的地,点对点的  文本信息-->  
	<bean id="queueSmsDestination" class="org.apache.activemq.command.ActiveMQQueue">  
	    <constructor-arg value="pinyougou_queue_sms"/>  
	</bean>    
	
</beans>

2)修改pinyougou-user-service的UserServiceImpl.java

@Override
public void genSmsCode(final String phone) {
	// 手机验证码是6位数字
	long random = (long) (Math.random() * 1000000);
	final String smsCode = random + "";
	// System.out.println(smsCode);
	// 保存到redis
	redisTemplate.boundHashOps("smsCode").put(phone, smsCode);
	
	// 发送短信
	jmsTemplate.send(queueSmsDestination, new MessageCreator() {
		@Override
		public Message createMessage(Session session) throws JMSException {
			MapMessage mapMessage = session.createMapMessage();
			mapMessage.setString("mobile", phone);//手机号
			mapMessage.setString("template_code", template_code);//模板编号
			mapMessage.setString("sign_name", sign_name);//签名				
			Map m=new HashMap<>();
			m.put("number", smsCode);				
			mapMessage.setString("param", JSON.toJSONString(m));//参数

			return mapMessage;
		}
	});
}

3)在pinyougou-common的properties目录下创建配置文件sms.properties

template_code=abc
sign_name=abc

启动短信微服务工程,启动user的服务与web工程测试

微服务工程的验证码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值