在上一篇文章中,我们使用springboot整合邮件实现发送功能,那么下面来用邮件发送功能实现用户注册,方便我们进一步熟悉邮件发送功能的使用。实现步骤大致如下:进行用户注册同时发送一封激活邮件,邮件里面包含一条激活链接,点击链接把使用UUIDUtils生产发送给用户的邮箱验证码提交进行验证,从而修改用户的激活状态,最后返回登陆页面进行验证登录。
一.效果演示
输入邮箱等一系列信息,点击注册,系统自动发送激活邮件到你绑定的邮箱地址。同时数据库里面增加一条用户信息,其中用户状态(status)默认值为0,需要进行激活改变状态才能授权登录。
如下,打开自己绑定的邮箱点击下面的激活链接,激活成功后跳转到登录页面
点击邮件激活链接的时候,验证链接中的激活码与数据库的code值是否一致,若验证成功则清除数据库中code的值,同时改变用户状态(即status的值由0变为1)。
二.编程实现步骤
1.实现邮件发送服务
如何实现邮件发送服务,可以参考我之前相关的文章:Springboot整合实现邮件发送
2.封装实体类
使用注解的方式快速创建User实体类
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class User { private int UserID; //账号 private String UserNumber; //密码 private String Password; //邮箱地址 private String Email; /** * 状态:0代表未激活,1代表激活 */ private Integer status; /** * 利用UUID生成一段数字,发动到用户邮箱,当用户点击链接时 * 在做一个校验如果用户传来的code跟我们发生的code一致,更改状态为“1”来激活用户 */ private String code; }
3.创建生成UUID的工具类
UUID产生的目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。UUID 来作为数据库中字段是非常不错的选择,保证每次生成的UUID 是唯一的
import java.util.UUID; /** * @Description:使用UUIDUtils生产发送给用户的邮箱验证码 */ public class UUIDUtils { public static String getUUID(){ return UUID.randomUUID().toString().replace("-",""); } }
4.创建Userdao接口
package com.kuang.Dao; import com.kuang.pojo.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; //@Mapper : 表示本类是一个 MyBatis 的 Mapper @Mapper @Repository public interface UsersDao { //登录 public User login(@Param("UserNumber") String UserNumber, @Param("Password") String Password); //找回密码 public User retrieve(@Param("Email") String Email); /** * 用户注册 * @param user */ void register(User user); /** * 根据激活码查询用户,之后再进行修改用户状态 * @param code * @return */ User checkCode(String code); /** * 激活账户,修改用户状态为"1" * @param user */ void updateUserStatus(User user); }
5.创建映射文件UserMapper.xml
注意:在mybatis中映射文件中的namespace是用于绑定Dao接口的,即面向接口编程,dao接口的方法对应mapper中的sql语名。
insert into user ( UserNumber, Password,Email,status,code) values (#{UserNumber,jdbcType=VARCHAR}, #{Password,jdbcType=VARCHAR}, #{Email,jdbcType=VARCHAR}, #{status,jdbcType=INTEGER},#{code,jdbcType=INTEGER}) update user set status=1,code=null where UserID=#{UserID}
6.创建UserService接口
package com.kuang.service; import com.kuang.pojo.User; public interface UserService { //用户登录 public User login(String userName, String password); //找回密码 public User retrieve(String email); /** * 用户注册 * @param user */ void register(User user); /** * 根据激活码code查询用户,之后再进行修改状态 * @param code * @return */ User checkCode(String code); /** * 激活账户,修改用户状态 * @param user */ void updateUserStatus(User user); }
7.创建UserServiceImpl实现类
注意:这里使用到的sendHtmlMail发送邮件方法,在相关的文章:Springboot整合实现邮件发送
package com.kuang.service.impl; import com.kuang.Dao.UsersDao; import com.kuang.pojo.User; import com.kuang.service.MailService; import com.kuang.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService { @Autowired private UsersDao usersDao; @Autowired private MailService mailService; /** * 登录验证 */ @Override public User login(String userName, String password){ return usersDao.login(userName,password); } /** * 忘记密码,邮件发送找回 */ @Override public User retrieve(String email){ return usersDao.retrieve(email); } /** * 用户注册,同时发送一封激活邮件 * @param user */ @Override public void register(User user) { usersDao.register(user); String code = user.getCode(); System.out.println("code:"+code); String subject = "来自智能化驾校管理系统的激活邮件"; ///checkCode?code=xxx即是我们点击邮件链接之后进行更改状态的 String context = "此邮件为官方激活邮件!请点击下面链接完成激活操作!
激活请点击:"+code+" "; //发送激活邮件 mailService.sendHtmlMail (user.getEmail(),subject,context); } /** * 根据激活码code进行查询用户,之后再进行修改状态 * @param code * @return */ @Override public User checkCode(String code) { return usersDao.checkCode(code); } /** * 激活账户,修改用户状态 * @param user */ @Override public void updateUserStatus(User user) { usersDao.updateUserStatus(user); } }
8.定义核心业务接口UserController控制类
package com.kuang.contorller; import com.kuang.common.UUIDUtils; import com.kuang.pojo.User; import com.kuang.service.UserService; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.thymeleaf.util.StringUtils; import javax.annotation.Resource; import javax.servlet.http.HttpSession; @Controller public class LoginContorller { @Resource private UserService userService; @RequestMapping("/main") public String login(@RequestParam("UserNumber") String UserNumber, @RequestParam("Password") String Password, Model model, HttpSession session) { //具体的业务 User user= userService.login(UserNumber,Password); if (user!=null){ session.setAttribute("loginUser",UserNumber); return "redirect:/Main"; }else if(StringUtils.isEmpty(UserNumber) && StringUtils.isEmpty(Password)){ model.addAttribute("msg","账号或者密码不能为空"); return "Login"; } else { model.addAttribute("msg","账号或者密码错误"); return "Login"; } } /** * 注册 * @param user * @return */ @RequestMapping(value = "/registerUser") public String register(User user){ user.setStatus(0); String code = UUIDUtils.getUUID()+ UUIDUtils.getUUID(); user.setCode(code); userService.register(user); return "login"; } /** *校验邮箱中的code激活账户 * 首先根据激活码code查询用户,之后再把状态修改为"1" */ @RequestMapping(value = "/selectCode") public String checkCode(String code){ User user = userService.checkCode(code); System.out.println(user); //如果用户不等于null,把用户状态修改status=1 if (user !=null){ user.setStatus(1); //把code验证码清空,已经不需要了 user.setCode(""); System.out.println(user); userService.updateUserStatus(user); } return "login"; } /** * 跳转到登录页面 * @return login */ @RequestMapping(value = "/loginPage") public String login(){ return "login"; } }
9.编写页面内容
在我们的项目开发过程中我们需要向后端发送请求,实现前后端的数据交互,这里使用了Thymeleaf模板引擎+form的方法。后台按照post的地址进行接收即可,需要注意的是,提交数据的时候,button
或者input
都设置成为submit