1.编写serviceImpl实现类。(这个类主要编写发送短信)
@Resource
JavaMailSender mailSender;//发送邮件对象
public void sendActivationMail(String maillTo, String activationCode) {
//activationMailMessage 邮件信息对象
SimpleMailMessage activationMailMessage = new SimpleMailMessage();
String key = "activation"+maillTo;//收件方邮箱
activationMailMessage.setSubject("这是一个标题");//标题
activationMailMessage.setFrom("[email protected]");//发送人
//注入的简单邮件消息对象,设置收件方
activationMailMessage.setTo(maillTo);
//设置邮件正文
activationMailMessage.setText("注册邮箱:"+maillTo+" 激活码:"+activationCode);
//注入的邮件发送器,负责登录服务器,发送邮件
mailSender.send(activationMailMessage);
//保存邮箱账号和激活码,到redis缓存中,30分钟后过期
redisService.set(key,activationCode,(long)30*60);
}
2.编写UserService实现类
(2.1)编写实现注册方法
/**
* 注册方法
* @param user
* @throws Exception
*/
@Override
public void itriptxCreateUser(ItripUser user) throws Exception {
//生成邮件中的激活码,例如:一串随机的数字
String activationCode = MD5.getMd5(new Date().toLocaleString(),32);
//发送邮件:第一个参数是用户注册的邮箱,第二个参数是激活码
mailService.sendActivationMail(user.getUserCode(),activationCode);
//新增一条用户注册信息到数据库中,但是activated字段为0(表示为激活)
itripUserMapper.insertItripUser(user);
}
(2.2编写根据email查找user方法。因为是注册账号之后还未实现激活所以需要根据email找到user来更新激活状态)
/**
* 根据email去查找一个user
* @param email
* @return
* @throws Exception
*/
@Override
public ItripUser findByUserName(String email) throws Exception {
Map<String,Object> map = new HashMap<>();
map.put("userCode",email);
if(itripUserMapper.findItripUserListByMap(map).size()==0){
return null;
}
return itripUserMapper.findItripUserListByMap(map).get(0);
}
(2.3 编写激活方法)
@Override
/**
* 根据邮箱去激活
* code 激活码
*/
public boolean activateByEmail(String email, String code) throws Exception {
String key = "activation"+email;
if(redisService.get(key).equals(code)){
//查找该用户对象
ItripUser user = this.findByUserName(email);
if(EmptyUtils.isNotEmpty(user)){
logger.debug("激活用户"+email);
user.setActivated(1);//激活用户
user.setUserType(0);//自注册用户
user.setFlatID(user.getId());
itripUserMapper.updateItripUser(user);//修改激活状态 (更新)
return true;
}
}
return false;
}
3.编写UserController
(3.1.1注册方法主体)
//注册方法 根据email注册 dto返回的结果是一种状态
@RequestMapping(value = "/doregister",produces = "application/json")
@ResponseBody//返回json
public Dto registerByEmail(@RequestBody ItripUserVO userVO){
//判断注册的邮箱是否存在,如果不存在 返回的json是失败状态
if(!validEmail(userVO.getUserCode()))
return DtoUtil.returnFail("请使用正确的邮箱地址注册",ErrorCode.AUTH_ILLEGAL_USERCODE);
try{
//封装数据到实体
ItripUser user = new ItripUser();
user.setUserCode(userVO.getUserCode());
user.setUserPassword(userVO.getUserPassword());
user.setUserType(0);
user.setUserName(userVO.getUserName());
//服务器再次进行重复验证,如果邮箱未注册 则继续
if(null == userService.findByUserName(userVO.getUserCode())){
//生成32位字符的md5加密 密码
user.setUserPassword(MD5.getMd5(userVO.getUserPassword(),32));
//调用service发送邮件,保存user数据,激活码保存在redis
userService.itriptxCreateUser(user);
return DtoUtil.returnSuccess();
}else{
return DtoUtil.returnFail("用户已存在,注册失败",ErrorCode.AUTH_USER_ALREADY_EXISTS);
}
}catch (Exception e){
e.printStackTrace();
return DtoUtil.returnFail(e.getMessage(),ErrorCode.AUTH_UNKNOWN);
}
}
(3.1.2 email格式验证的正则表达式)
//验证email
public boolean validEmail(String email){
//正则表达式email
String regex = "^[A-Za-z0-9\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";
return Pattern.compile(regex).matcher(email).find();
//return true;
}
(3.1.3 ItripUserVO 封装的参数)
(3.1.4 MD5 工具类(密码需要设置加密))
(3.2.1 激活方法主体 。 注册成功之后用户实现激活)
//激活方法 根据email
@RequestMapping(value = "/activate",method = RequestMethod.PUT,produces = "application/json")
@ResponseBody
public Dto activateByEmail(@RequestParam String user ,@RequestParam String code){
try{
if(userService.activateByEmail(user,code)){
return DtoUtil.returnSuccess("激活成功");
}else{
return DtoUtil.returnSuccess("激活失败");
}
}catch (Exception e){
e.printStackTrace();
return DtoUtil.returnFail("激活失败",ErrorCode.AUTH_ACTIVATE_FAILED);
}
}
(3.2.2 DtoUtil工具类 封装数据)