Itrip项目(2)实现用户注册功能

280 阅读8分钟

一、用户注册模块

1、后台界面
(1)新建Springboot项目prjuser,在Dependencies中勾选Developer Tools里的Springboot DevTools、Web里的Spring Web、SQL里的Spring Data JDBC,MySQL Driver,MyBatis Framework->Finish
(2)在pom.xml文件里修改版本

mysql的版本 <version>5.1.47</version>
springframework的版本<version>1.5.9.RELEASE</version>
mybatis.spring.boot的版本<version>2.1.0</version>

并添加druid数据源依赖、 jsp依赖、 fastJson转换java对象为json字符串的包、servlet依赖
(3)配置application.properties:

server.port=9001
server.servlet.context-path=/
spring.datasource.url=jdbc:mysql://localhost:3306/itripdb
spring.datasource.username=root
spring.datasource.password=java
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.initial-size=1
spring.datasource.druid.min-idle=1
spring.datasource.druid.max-active=20
spring.datasource.druid.test-on-borrow=true
spring.datasource.druid.stat-view.servlet.allow=true
mybatis.type-aliases-package=com.po
mybatis.mapper-locations=classpath:mapper/*.xml

(4)在项目里新建po、biz、action、mapper包,在resource目录下新建(New Directory)mapper包
通过MyBatisGenerator 生成代码将实体类ItripUser、ItripUserLinkUser拷入项目的po包
将ItripUserMapper、ItripUserLinkUserMapper拷入项目的mapper包
将ItripUserMapper.xml、ItripUserLinkUserMapper.xml拷入项目的resource目录下mapper包

(5)在业务biz包新建接口ItripUsersBiz以及接口实现类ItripUsersBizImp

package com.biz;
import com.po.*;
import java.util.*;
public interface ItripUsersBiz {
   public int save(ItripUser user);
   public int update(ItripUser user);
   public ItripUser findById(Long id);
   public ItripUser check(ItripUser user);
}
package com.zhaolong.biz.imp;
import ...
@Service
@Transactional
public class ItripUsersBizImp implements ItripUsersBiz {
	@Autowired
	private ItripUserMapper itripUserMapper;
	public ItripUserMapper getItripUserMapper() {
		return itripUserMapper;
	}
	public void setItripUserMapper(ItripUserMapper itripUserMapper) {
		this.itripUserMapper = itripUserMapper;
	}
	@Override
	public int save(ItripUser user) {
		int rows=itripUserMapper.insert(user);
		if(rows>0){
			return rows;
		}
		return 0;
	}
	@Override
	public int update(ItripUser user) {
		int rows=itripUserMapper.updateByPrimaryKey(user);
		if(rows>0){
			return rows;
		}
		return 0;
	}
	@Override
	public ItripUser findById(Long id) {
		ItripUser users=itripUserMapper.selectByPrimaryKey(id);
		if(users!=null){
			return users;
		}
		return null;
	}
	@Override
	public ItripUser check(ItripUser user) {
		ItripUser newus=itripUserMapper.check(user);
		if(newus!=null){
			return newus;
		}
		return null;
	}
}

(6)在action包新建控制接口以及接口实现类

public interface ITripUserAction {
   //注册
   public String save(HttpServletRequest request, HttpServletResponse response,ItripUser user);
   //更新
   public String update(HttpServletRequest request, HttpServletResponse response,ItripUser user);
   //查找
   public String findById(HttpServletRequest request, HttpServletResponse response,Long id);
   //验证
   public String check(HttpServletRequest request, HttpServletResponse response,ItripUser user);
}
import ...
@RestController
public class ItripUserImpAction implements ITripUserAction {
	@Autowired
	private ItripUsersBiz itripUsersBiz;
	public ItripUsersBiz getItripUsersBiz() {
		return itripUsersBiz;
	}
	public void setItripUsersBiz(ItripUsersBiz itripUsersBiz) {
		this.itripUsersBiz = itripUsersBiz;
	}
	@Override
	@RequestMapping(value = "save_Users.do")
	public String save(HttpServletRequest request, HttpServletResponse response, ItripUser user) {
		System.out.println("action-->user--->"+user);
		/*****手机注册********/
		if(user!=null&&user.getCode()!=0&&user.getCode()==1){
			//获取手机验证码,验证手机验证码是否正确....
			user.setActivated(1);//验证成功设置为1
			int code=itripUsersBiz.save(user);
			if(code>0){
				return ""+1;
			}
		}
		return ""+0;
	}
	@Override
	@RequestMapping(value = "update_Users.do")
	public String update(HttpServletRequest request, HttpServletResponse response, ItripUser user) {
		return null;
	}
	@Override
	@RequestMapping(value = "findById_Users.do")
	public String findById(HttpServletRequest request, HttpServletResponse response, Long id) {
		return null;
	}
	@Override
	@RequestMapping(value = "check_Users.do")
	public String check(HttpServletRequest request, HttpServletResponse response, ItripUser user) {
		return null;
	}
}

(7)在启动类里添加注解描述

@SpringBootApplication
@MapperScan(basePackages = {"com.mapper"})
@ComponentScan(basePackages = {"com.biz","com.action"})

2、前端界面
(1)新建Springboot项目prjview,在Dependencies中勾选Developer Tools里的Springboot DevTools、Web里的Spring Web->Finish
(2)在pom.xml文件里修改springframework的版本
<version>1.5.9.RELEASE</version>
(3)在src->main下建立webapp->WEB-INF目录,在webapp文件夹中拷入项目给定的原始静态页面文件
在application.properties配置server.port=9002
上一个项目prjuser的端口号为9001,两个项目将来部署在不同的Tomcat服务器上,之后打包成war包放入Docker,用Nginx作为代理来调用
(4)在register.html界面添加 <form class="fromOne" action="http://localhost:9001/save_Users.do" method="post">(绝对路径)
接下来将register.html、register.js文件里的属性值与实体类的属性值进行匹配

二、项目实现手机注册功能

(1)在prjuser工程项目中导入第三方容联云通讯的jar包CCP_REST_SMS_SDK_JAVA_v2.63r.jar
点击Project Structure->Modules->Dependencies->点击‘+’号->JARs or Directories...->添加容联云通讯jar包路径->Apply->OK,在External libraries里查看

为了将工程以后打包成war包,在prjuser工程中添加依赖:

<!--在工程下新建lib目录,将SMS的jar包拷入lib目录-->
<dependency>
   <groupId>com.zhaolong</groupId>
   <artifactId>prjuser</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <scope>system</scope>
   <systemPath>${project.basedir}/lib/CCP_REST_SMS_SDK_JAVA_v2.6.3r.jar</systemPath>
</dependency>

<!--在<plugin>标签里写上main方法所在类的路径-->
	<configuration>
		<mainClass>com.zhaolong.prjuser.PrjuserApplication</mainClass>
		<includeSystemScope>true</includeSystemScope>
	</configuration>
		<executions>
			<execution>
				<goals>
				<goal>repackage</goal>
				</goals>
			</execution>
		</executions>

<!--在<bulid>标签里写上资源路径-->
<resources>
	<resource>
		ectory>lib</directory>
		<targetPath>BOOT-INF/lib/</targetPath>
		<includes>
		<include>**/*.jar</include>
		</includes>
	</resource>
</resources>

(2)在prjuser项目里建立工具类SmsUtil

public class SmsUtil {
	public static String  sendSms(String tel,String templateId,String[] datas){
		CCPRestSmsSDK ccpRestSmsSDK=new CCPRestSmsSDK();
		ccpRestSmsSDK.init("app.cloopen.com","8883");
	ccpRestSmsSDK.setAccount("8aaf07086d05d00c016d3e65fe5820ea","04f31c810a794abdb2968734f5ca5fdd");
		ccpRestSmsSDK.setAppId("8aaf07086d05d00c016d3e65feb420f1");
*******************************************************************************
		HashMap<String,Object> result = ccpRestSmsSDK.sendTemplateSMS(tel,templateId ,datas);
		if("000000".equals(result.get("statusCode"))){
			HashMap<String,Object> data=(HashMap<String,Object>)result.get("data");
			System.out.println("短信发送成功!");
			Set<String> keySet = data.keySet();
			for(String key:keySet){
				Object object = data.get(key);
				System.out.println(key +" = "+object);
			}return "ok";
		}else{
			System.out.println("错误码=" + result.get("statusCode") +" 错误信息= "+result.get("statusMsg"));
		}return "fail";
	}
}

(3)在控制器类ItripUserImpAction里添加发送验证码的方法

import com.zhaolong.util.SmsUtil;
	 //发送验证码
	@RequestMapping("sendSms_Users.do")
	public String sendSms(HttpServletRequest request, HttpServletResponse response,String tel){		//获取当前时间毫秒的后四位作为验证码
		Date date=new Date();
		long datetime=date.getTime();
		//保留后四位数字为验证码
		String val=""+datetime;
		smsck=val.substring(val.length()-4,val.length());
		System.out.println("验证码-->"+smsck);
		String rst=SmsUtil.sendSms(tel, templated:""+1,new String[]{smsck,"5"});
		return rst;  
	    
	}

(4)register.html中将激活码块添加id="btactivecode",
并且在register.js中添加获取手机验证码功能

//点击获取手机验证码的按钮事件
$("#btactivecode").click(function(){
  //获取手机号码
  var telnum=$("#usercode").val();
  //alert(telnum);
  $.get('http://127.0.0.1:9001/sendSms_Users.do?tel='+telnum,jsonpCallback(function(rst){
    alert(rst);
    if(rst=='ok'){
      alert('发送成功,请注意查看手机短信验证码!');
      return;
    }else{
      alert("发送失败!");
    }
  }),jsonp);
});

(5)在pom.xml文件中添加Redis组件库包括Token依赖的组件包、打开Redis缓存依赖cache、引入Jedis组件
在application.properties里添加Redis服务配置
下一步将Redis注入到项目里面

(6)在prjuser项目里建立工具类TokenGeneratorUtilRedisUtil

public class TokenGeneratorUtil {
	public static String getTokenUerid(String token) {
	System.out.println("token--->"+token);
		String userId = JWT.decode(token).getAudience().get(0);		
		return userId;
	}
	public static String getTokenGenerator(ItripUser us){
		String token=null;
		Date start=new Date();
		Long cdate=System.currentTimeMillis()+60*60*1000;
		Date end = new Date(cdate);
		token= JWT.create().withAudience(us.getUsercode().toString()).withIssuedAt(start).withExpiresAt(end).sign(Algorithm.HMAC256(us.getActivecode()));
		System.out.println("token--->"+token);
		return token;
	}
}
public class RedisUtil {
	public static boolean addRedis(String keys,Object token){
		Jedis jedis=new Jedis("localhost",6379);	
		try {
			jedis.set(keys, token.toString());
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
	public static String getTokenCodeFromRedis(String key){
		Jedis jedis=new Jedis("localhost",6379);
		try {
			String token=jedis.get(key);
			String tel=TokenGeneratorUtil.getTokenUerid(token);
			return tel;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

(7)在控制器类ItripUserImpAction里更新方法

private String smsck;//手机激活码,发送给客户端,将smsck设置为全局变量
        @Override
	@RequestMapping(value = "save_Users.do")
	public String save(HttpServletRequest request, HttpServletResponse response, ItripUser user) {
		System.out.println("action-->user--->"+user);
		/*****手机注册********/
		if(user!=null&&user.getCode()!=0&&user.getCode()==1){
			//从redies中获取用户存储的手机号码
			String  redisTel=RedisUtil.getTokenCodeFromRedis(user.getUsercode());
			System.out.println("redisTel--->"+redisTel);
			//从客户端传递的手机号码和redis中存储的手机号码匹配
			if(redisTel!=null&&redisTel.equals(user.getUsercode())){
				//如果匹配,则不允许重复注册!
				return "不允许重复注册";
			}
			System.out.println("smsck--->"+smsck);
			//获取手机验证码,验证手机验证码是否正确....
			if(smsck!=null&&smsck.equals(user.getActivecode())){
				user.setActivated(1);//验证成功设置为1
			}else{
				return "手机验证码错误!";
			}
			int code=itripUsersBiz.save(user);
			if(code>0){
				//生成Token准备设置到Token数据库
			String tokencode= TokenGeneratorUtil.getTokenGenerator(user);
				//将Token字符串保存到redis中
				RedisUtil.addRedis(user.getUsercode(), tokencode);
				return "注册成功";
			}
		}
		return "注册失败";
	}

三、项目实现邮箱注册功能

(一)、使用springboot实现邮件发送(测试)

(1)首先在邮箱设置中开启POP3/SMTP服务、IMAP/SMTP服务

(2)新建Springboot项目prjEmail,在pom.xml文件里配置:

<version>1.5.9.RELEASE</version>
<--!引入邮箱的依赖包-->
<dependency>
    <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

(3)在application.properties中配置邮箱

#邮件发送配置
server.port=9003
spring.mail.default-encoding=UTF-8 #邮件编码格式
spring.mail.host=smtp.163.com
#spring.mail.username=你的邮箱
spring.mail.username=zhhlk@163.com
#spring.mail.password=邮箱授权码(开启POP3/SMTP、IMAP/SMTP服务时邮箱网站会提供)
spring.mail.password=zhhlk163
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

(4)在项目里新建控制器类SendMailAction

@RestController
public class SendMailAction {
	@Autowired
	private JavaMailSender mailSender;

	public JavaMailSender getMailSender() {
		return mailSender;
	}
	public void setMailSender(JavaMailSender mailSender) {
		this.mailSender = mailSender;
	}

	@RequestMapping(value = "sendMail.do")
	public String sendMail(String reemial){
                //JavaMailSender mailSender=new JavaMailSenderImpl();
		//SimpleMailMessage是邮件信息类,用于包装发送的邮件信息
		SimpleMailMessage message = new SimpleMailMessage();
		message.setFrom("zhhlk@163.com");//设置发送者邮件地址
		message.setTo(remail);//设置收件人地址
		message.setSubject("测试");//标题
		message.setText("这是一封测试邮件");//内容
		mailSender.send(message);
		return "ok";
	}
}

(5)在resource目录下新建webapp->WEB-INF设置为web资源路径并在webapp目录下新建index.jsp

<body>
	<form action="/sendMail.do" method="post">
		输入邮件地址:<input type="text" name="remail"/>
		<input type="submit" value="确定">
	</form>
</body>

(6)注意记得在pom.xml文件里添加jsp依赖(否则测试会弹出下载jsp文件窗口)以及在启动类PrjSpringbootEmailApplication里添加扫描注释,在浏览器栏输入localhost:9003/index.jsp验证

(二)、在prjuser工程中实现邮箱注册验证功能

(1)在prjuser项目的pom.xml中导入邮箱的依赖包以及在application.properties添加邮箱发送的配置

(2)在工具包里新建工具类EmailUtil

public class EmailUtil {
	public static String sendMail(JavaMailSender mailSender,String remail,String checkcode) throws Exception{
		//JavaMailSender mailSender=new JavaMailSenderImpl();
		//SimpleMailMessage是邮件信息类,用于包装发送的邮件信息
		SimpleMailMessage message = new SimpleMailMessage();
		message.setFrom("zhhlk@163.com");//设置发送者邮件地址
		message.setTo(remail);//设置收件人地址
		message.setSubject("验证码");//标题
		message.setText("您的验证码为:"+checkcode);//内容
		mailSender.send(message);
		return "ok";
	}
}

(3)在实体类ItripUser中添加属性 private String activeEmailcode; //邮箱激活码并生成get/set方法
在控制器类ItripUserImpAction里添加邮箱注册的方法

@CrossOrigin(allowCredentials="true",maxAge = 3600) //跨域请求注解
@RestController
public class ItripUserImpAction implements ITripUserAction {
private String emailck; //邮箱激活码,发送给接受者
@Autowired
	private JavaMailSender mailSender;

	public JavaMailSender getMailSender() {
		return mailSender;
	}

	public void setMailSender(JavaMailSender mailSender) {
		this.mailSender = mailSender;
	}
	
/**邮箱注册的方法**/
	@CrossOrigin  //跨域请求注解
	@RequestMapping(value = "saveEmailRegist_Users.do")
	public String saveEmailRegist(HttpServletRequest request, HttpServletResponse response, ItripUser user){
		System.out.println("action-->user--->"+user);
		/*****邮箱注册********/
		if(user!=null&&user.getCode()!=0&&user.getCode()==2){
			//从redies中获取用户存储的邮箱号码
			String redisEmial=RedisUtil.getTokenCodeFromRedis(user.getUsercode());
			System.out.println("redisTel--->"+redisEmial);
			//从客户端传递的邮箱号码和redis中存储的邮箱号码匹配
			if(redisEmial!=null&&redisEmial.equals(user.getUsercode())){
				//如果匹配,则不允许重复注册!
				return "不允许重复注册";
			}
			System.out.println("emalck--->"+emailck);
			//获取邮箱验证码,验证邮箱验证码是否正确....
			if(emailck!=null&&emailck.equals(user.getActivecode())){
				user.setActivated(1);//验证成功设置为1
			}else{
				return "邮箱验证码错误!";
			}
			int code=itripUsersBiz.save(user);
			if(code>0){
				//生成Token准备设置到Token数据库
				String tokencode= TokenGeneratorUtil.getTokenGenerator(user);
				//将Token字符串保存到redis中
				RedisUtil.addRedis(user.getUsercode(), tokencode);

				return "邮箱注册成功";
			}
		}
		return "邮箱注册失败";
	}

/**发送邮箱验证码**/
		@RequestMapping("sendEmial_Users.do")
	public String sendEmail(HttpServletRequest request, HttpServletResponse response,String email){
		if(email==null){
			return "email不能为空!";
		}
		//获取当前时间毫秒的后四位作为验证码
		Date date=new Date();
		long datetime=date.getTime();
		//保留后四位数字为验证码
		String val=""+datetime;
		emailck=val.substring(val.length()-4,val.length());
		System.out.println("验证码-->"+emailck);
		String rst= null;
		try {
			rst = EmailUtil.sendMail(mailSender,email,emailck);
			return rst;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "fail";
	}

(4)在客户端prjview项目中register.html对应属性修改

<form class="fromTwo" action="http://localhost:9001/saveEmailRegist_Users.do" method="post">
	<div class="i_mobile i_mail">
              注册邮箱 <input name="usercode" id="email" type="text" placeholder="请输入邮箱号码" />
	<!-- 用于邮箱注册判断的操作码 -->
        <input name="code" id="ecode" type="hidden" value="2"><span></span></div>
	<div class="i_pwd">
              登陆密码 <input name="userpassword" id="pwd" type="password" placeholder="请输入密码" /><span></span></div>
         <div class="i_mobile">
              昵&nbsp;&nbsp;&nbsp;&nbsp;称   <input name="username" id="emailuname" type="text" placeholder="请输入昵称" /><span></span></div>
       	<div class="i_check">
              验证码  <input type="text" placeholder="请输入验证码" /><span></span>
      	<div class="i_check_in"></div><i class="idCode">换一张</i></div>
	<div class="i_lives">
              激活码  <input type="text" name="activecode" id="activeEmailcode" placeholder="请输入激活码" /><a id="btemailacode" href="#">获取激活码</a></div>
</form>

(5)对register.js文件进行编写

//点击获取邮箱验证吗的按钮事件
$("#btemailacode").click(function(){
 //获取邮箱地址
  var email=$("#email").val();
  $.get('http://127.0.0.1:9001/sendEmial_Users.do?email='+email,function(rst){
    if(rst=='ok'){
       alert('发送成功,请在邮箱中查看验证码激活!');
       return;
    }else{
      alert('邮件发送失败! ');
    }

// 邮箱注册
$('.submitTwo').click(function(){
  alert('saveemial---'+ok2+","+ok3);
  if(ok2 && ok3){
    var date=new Date();
    alert("ok--saveemail");
    /**************************************************************************/
    //获取邮箱验证表单的值
    var usercode=$("#email").val();
    var code=$("#ecode").val();
    var userpassword=$("#pwd").val();
    var username=$("#emailuname").val();
    var activecode=$("#activeEmailcode").val();
    var escreationdate=date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();
    //将数据组织为json对象
    var jsondata={
        'usercode':usercode,
        'code':code,
        'userpassword':userpassword,
        'username':username,
        'activecode':activecode,
        'screationdate':escreationdate
    };