81分布式电商项目 - 用户注册

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 81分布式电商项目 - 用户注册

本文将讲解用户注册功能

工程搭建

用户服务接口层

(1)创建 pinyougou-user-interface(jar)

(2)引入 pojo 依赖

用户服务实现层

(1)创建 pinyougou-user-service(war)

(2)引入 spring dubbox activeMQ 相关依赖,引入依赖( pinyougou-user-interface pinyougou-dao pinyougou-common),运行端口为 9006

(3)添加 web.xml

(4)创建 Spring 配置文件 applicationContext-service.xml 和 applicationContent-tx.xml

<dubbo:protocol name="dubbo" port="20886" />
<dubbo:annotation package="com.pinyougou.user.service.impl" />
<dubbo:application name="pinyougou-user-service"/>
<dubbo:registry address="zookeeper://192.168.25.135:2181"/>
用户中心WEB层

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

(1)添加 web.xml

(2)引入依赖 pinyougou-user-interface 、spring 相关依赖(参照其它 web 工程),tomcat 运行端口 9106

(3)添加 spring 配置文件

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

基本注册功能实现

生成和拷贝代码

后端服务实现层

修改 pinyougou-user-service 的 UserServiceImpl.java

/**
* 增加
*/
@Override
public void add(TbUser user) {
  user.setCreated(new Date());//创建日期
  user.setUpdated(new Date());//修改日期
  String password = DigestUtils.md5Hex(user.getPassword());//对密码加密
  user.setPassword(password);
  userMapper.insert(user);
}
前端控制层

修改 userController.js

//控制层
app.controller('userController' ,function($scope,$controller ,userService){
//注册
$scope.reg=function(){
if($scope.entity.password!=$scope.password) {
alert("两次输入的密码不一致,请重新输入");
return ;
} 
userService.add( $scope.entity ).success(
function(response){
alert(response.message);
}
);
} 
});
修改页面

修改页面 register.html ,引入 js

<script type="text/javascript" src="plugins/angularjs/angular.min.js"></script> 
<script type="text/javascript" src="js/base.js"></script> 
<script type="text/javascript" src="js/service/userService.js"></script>
<script type="text/javascript" src="js/controller/userController.js"></script>

指令

<body ng-app="pinyougou" ng-controller="userController" >

绑定表单

<form class="sui-form form-horizontal">
      <div class="control-group">
        <label class="control-label">用户名:</label>
        <div class="controls">
          <input type="text" placeholder="请输入你的用户名" ng-model="entity.username" class="input-xfat input-xlarge">
        </div>
      </div>
      <div class="control-group">
        <label for="inputPassword" class="control-label">登录密码:</label>
        <div class="controls">
          <input type="password" placeholder="设置登录密码" ng-model="entity.password" class="input-xfat input-xlarge">
        </div>
      </div>
      <div class="control-group">
        <label for="inputPassword" class="control-label">确认密码:</label>
        <div class="controls">
          <input type="password" placeholder="再次确认密码" ng-model="password" class="input-xfat input-xlarge">
        </div>
      </div>
      <div class="control-group"><label class="control-label">手机号:</label>
        <div class="controls"><input type="text" placeholder="请输入你的手机号" ng-model="entity.phone" class="input-xfat input-xlarge"></div>
      </div>
      <div class="control-group"><label for="inputPassword" class="control-label">短信验证码:</label<div class="controls"><input type="text" placeholder="短信验证码" class="input-xfat 
input-xlarge"> <a href="#">获取短信验证码</a></div></div><div class="control-group"><label for="inputPassword"class="control-label">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
        <div class="controls"><input name="m1" type="checkbox" value="2" checked=""><span>同意协并注册《品优购用户协议》</span></div>
      </div>
      <div class="control-group">
        <label class="control-label"></label>
        <div class="controls btn-reg">
          <a class="sui-btn btn-block btn-xlarge btn-danger" ng-click="reg()target=" _blank ">完成注册</a>
          </div>
      </div>
    </form>

注册判断短信验证码

实现思路

点击页面上的”获取短信验证码”连接,向后端传递手机号。后端随机生成 6 位数字作为短信验证码,将其保存在 redis 中(手机号作为 KEY),并发送到短信网关。

用户注册时,后端根据手机号查询 redis 中的验证码与用户填写的验证码是否相同,如果不同则提示用户不能注册。

生成验证码

(1)修改 pinyougou-user-interface 工程 UserService.java ,增加方法

/**
* 生成短信验证码
* @return
*/
public void createSmsCode(String phone);

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

@Autowiredprivate RedisTemplate<String , Object> redisTemplate;
/*** 生成短信验证码*/
public void createSmsCode(String phone){
//生成 6 位随机数String code = (long) (Math.random()*1000000)+"";System.out.println("验证码:"+code);
//存入缓存
redisTemplate.boundHashOps("smscode").put(phone, code);
//发送到 activeMQ ....
}

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

(4)修改 pinyougou-user-web 的 UserController.java

/*
** 发送短信验证码
* @param phone
*  @return
* */
@RequestMapping("/sendCode")
public Result sendCode(String phone){
//判断手机号格式
if(!PhoneFormatCheckUtils.isPhoneLegal(phone)){
return new Result(false, "手机号格式不正确");
}
try {
  userService.createSmsCode(phone);//生成验证码
  return new Result(true, "验证码发送成功");
} catch (Exception e) {
  e.printStackTrace();
  return new Result(true, "验证码发送失败");
 } 
}

(5)pinyougou-user-web 的 userService.js

//发送验证码
this.sendCode=function(phone){
  return $http.get("../user/sendCode.do?phone="+phone);
}

(6)pinyougou-user-web 的 userController.js

//发送验证码
$scope.sendCode=function(){
  if($scope.entity.phone==null){
    alert("请输入手机号!");return ;
   }
  userService.sendCode($scope.entity.phone).success(
  function(response){
    alert(response.message);
    }
  );
}

(7)修改页面 register.html

<a ng-click="sendCode()" >获取短信验证码</a>
用户注册判断验证码

(1)修改 pinyougou-user-interface 的UserService.java

/**
* 判断短信验证码是否存在
*  @param phone
*  @return
* */
public boolean checkSmsCode(String phone,String code);

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

/**
* 判断验证码是否正确
*/
public boolean checkSmsCode(String phone,String code){
  //得到缓存中存储的验证码
  String sysCode = (String) redisTemplate.boundHashOps("smscode").get(phone);
  if(sysCode==null){
    return false; 
  }
  if(!sysCode.equals(code)){
    return false;
   }
   return true;
  }

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

/**
* 增加
* 
*  @param user
* @return
*/
@RequestMapping("/add")
public Result add(@RequestBody TbUser user,String smscode){
  boolean checkSmsCode =userService.checkSmsCode(user.getPhone(), smscode);
  if(checkSmsCode==false){
    return new Result(false, "验证码输入错误!");
  }try {
    userService.add(user);
    return new Result(true, "增加成功");
  } catch (Exception e) {
    e.printStackTrace();
    return new Result(false, "增加失败");
  } 
}

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

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

(5)修改 pinyougou-portal-web 的UserController.java

//保存
$scope.reg=function(){
  userService.add( $scope.entity, $scope.smscode ).success(
    function(response){
      alert(response.message);
    }
  );
}

(6)修改页面,绑定变量

<input type="text" placeholder="短信验证码" ng-model="smscode" class="input-xfat input-xlarge">
<a href="#" ng-click="sendCode()">获取短信验证码</a>
短信验证码发送到手机

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

<!-- 真正可以产生 Connection 的 ConnectionFactory,由对应的 JMS 服务厂商提供-->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="tcp://192.168.25.135:61616"/>
</bean>
    <!-- Spring 用于管理真正的 ConnectionFactory 的 ConnectionFactory -->
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<!-- 目标 ConnectionFactory 对应真实的可以产生 JMS Connection 的 ConnectionFactory -->
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
</bean>
    <!-- Spring 提供的 JMS 工具类,它可以进行消息发送、接收等 -->
<bean id="jmsTemplate"
      class="org.springframework.jms.core.JmsTemplate"><!-- 这个 connectionFactory 对应的是我们定义的 Spring 提供的那个 ConnectionFacto对象 -->
<property name="connectionFactory" ref="connectionFactory"/>
</bean><!--这个是点对点消息 -->
<bean id="smsDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="sms"/>
</bean>

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

@Autowiredprivate
    JmsTemplate jmsTemplate;
    @Autowiredprivate
    Destination smsDestination;
    @Value("${template_code}")
    private String template_code;
    @Value("${sign_name}")
    private String sign_name;
    /*** 生成短信验证码*/
    public void createSmsCode(final String phone) {//生成 6 位随机数final String code = (long) (Math.random()*1000000)+"";System.out.println("验证码:"+code);//存入缓存redisTemplate.boundHashOps("smscode").put(phone, code);//发送到 activeMQ
        jmsTemplate.send(smsDestination, new MessageCreator() {
            @Overridepublic
            Message createMessage(Session session) throws JMSException {
                MapMessage mapMessage = session.createMapMessage();
                mapMessage.setString("mobile", phone);//手机号mapMessage.setString("template_code", "SMS_85735065");//模板编号mapMessage.setString("sign_name", "黑马");//签名Map m=new HashMap<>();m.put("number", code);mapMessage.setString("param", JSON.toJSONString(m));//参数return mapMessage;}});}
            }
     }

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

template_code=SMS_85735065
sign_name=\u9ED1\u9A6C


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
5月前
|
Java 调度 Maven
【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目(下)
【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目(下)
118 0
|
2月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
170 0
|
5月前
|
SQL 负载均衡 监控
【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目(上)
【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目
104 0
|
3月前
|
存储 NoSQL 文件存储
C++ 哈希表企业级项目运用---淘宝分布式文件系统
C++ 哈希表企业级项目运用---淘宝分布式文件系统
|
4月前
|
网络协议 Devops 大数据
【分布式】大型互联网项目特点
【1月更文挑战第25天】【分布式】大型互联网项目特点
|
4月前
|
存储 缓存 监控
【分布式】大型互联网项目架构目标
【1月更文挑战第25天】【分布式】大型互联网项目架构目标
|
4月前
|
Java API
分布式锁【分布式锁概述、业务介绍、创建SpringBoot项目】(一)-全面详解(学习总结---从入门到深化)
分布式锁【分布式锁概述、业务介绍、创建SpringBoot项目】(一)-全面详解(学习总结---从入门到深化)
21 0
|
5月前
|
编译器 定位技术 开发工具
分布式版本控制系统Git的下载、安装与使用其复制GitHub项目代码的方法
分布式版本控制系统Git的下载、安装与使用其复制GitHub项目代码的方法
|
6月前
|
缓存 Java API
微服务轮子项目(38) -分布式日志链路跟踪
微服务轮子项目(38) -分布式日志链路跟踪
74 0
|
6月前
|
存储 负载均衡 API
微服务轮子项目(35) -FastDFS分布式文件系统
微服务轮子项目(35) -FastDFS分布式文件系统
74 0