一、用户注册模块
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项目里建立工具类TokenGeneratorUtil和RedisUtil
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">
昵 称 <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
};