• 二、注册功能


    🍀 注册分析

    🍀 表单校验1

    主要是为了 测试分析校验 测试表单的提交与否

    1. <script>
    2. /**
    3. * 表单校验:
    4. * 1。用户名 单词字符 8~20位
    5. * 2.密码 单词字符 8~20位
    6. * 3.Email 邮件格式
    7. * 4.姓名 非空
    8. * 5.手机号 手机号格式
    9. * 6.出生日期 非空
    10. * 7.验证码 非空
    11. */
    12. //校验用户名
    13. function checkUsername() {
    14. alert("用户名校验")
    15. return false;
    16. }
    17. function checkPassword() {
    18. alert("密码校验")
    19. return false;
    20. }
    21. $(function () {
    22. //当表单提交时 调用所有的校验方法
    23. $("#registerForm").submit(function () {
    24. return checkUsername() && checkPassword();
    25. //如果这个方法没有返回值 或者返回值为true 则表单提交 如果返回为false 则表单不提交
    26. })
    27. //当某一个组件失去焦点时 调用对应的方法
    28. $("#username").blur(checkUsername);
    29. $("#password").blur(checkPassword);
    30. })
    31. </script>

    🍀 表单校验2

    表单提交的时候进行校验 鼠标离开输入框的时候校验 校验标准如下

    1. <script>
    2. /**
    3. * 表单校验:
    4. * 1。用户名 单词字符 8~20位
    5. * 2.密码 单词字符 8~20位
    6. * 3.Email 邮件格式
    7. * 4.姓名 非空
    8. * 5.手机号 手机号格式
    9. * 6.出生日期 非空
    10. * 7.验证码 非空
    11. */
    12. //校验用户名
    13. function checkUsername() {
    14. //1.获取用户名值
    15. var username = $("#username").val();
    16. //2.定义正则
    17. var reg_username = /^\w{8,20}$/;
    18. //3.判断 给出提示
    19. var flag = reg_username.test(username);
    20. if (flag) {
    21. //用户名合法
    22. $("#username").css("border", "")
    23. } else {
    24. //用户名非法
    25. $("#username").css("border", "2px solid red")
    26. }
    27. return flag;
    28. }
    29. function checkPassword() {
    30. //1.获取用户名值
    31. var password = $("#password").val();
    32. //2.定义正则
    33. var reg_password = /^\w{8,20}$/;
    34. //3.判断 给出提示
    35. var flag = reg_password.test(password);
    36. if (flag) {
    37. //用户名合法
    38. $("#password").css("border", "")
    39. } else {
    40. //用户名非法
    41. $("#password").css("border", "2px solid red")
    42. }
    43. return flag;
    44. }
    45. //邮箱校验
    46. function checkEamil() {
    47. var email = $("#email").val();
    48. // var reg_email = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;//邮箱校验 复杂的
    49. var reg_email = /^\w+@\w+\.\w+$/;//简单一点的
    50. var flag = reg_email.test(email);
    51. if (flag) {
    52. $("#email").css("border", "")
    53. } else {
    54. $("#email").css("border", "2px solid red")
    55. }
    56. return flag;
    57. }
    58. //姓名校验
    59. function checkName() {
    60. var name = $("#name").val();
    61. var reg_name = /^[\u4e00-\u9fa5]{2,6}$/;//汉字
    62. var flag = reg_name.test(name);
    63. if (flag) {
    64. $("#name").css("border", "")
    65. } else {
    66. $("#name").css("border", "2px solid red")
    67. }
    68. return flag;
    69. }
    70. //手机号校验
    71. function checkTelephone() {
    72. var telephone = $("#telephone").val();
    73. var reg_telephone = /^(13[0-9]|17[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/;//手机号
    74. var flag = reg_telephone.test(telephone);
    75. if (flag) {
    76. $("#telephone").css("border", "")
    77. } else {
    78. $("#telephone").css("border", "2px solid red")
    79. }
    80. return flag;
    81. }
    82. //出生日期 正则 不为空 /^.+$/
    83. function checkBirthday() {
    84. var birthday = $("#birthday").val();
    85. var reg_birthday = /^.+$/;//出生日期
    86. var flag = reg_birthday.test(birthday);
    87. if (flag) {
    88. $("#birthday").css("border", "")
    89. } else {
    90. $("#birthday").css("border", "2px solid red")
    91. }
    92. return flag;
    93. }
    94. //验证码
    95. function checkCheck() {
    96. var check = $("#check").val();
    97. var reg_check = /^.+$/;//验证码
    98. var flag = reg_check.test(check);
    99. if (flag) {
    100. $("#check").css("border", "")
    101. } else {
    102. $("#check").css("border", "2px solid red")
    103. }
    104. return flag;
    105. }
    106. $(function () {
    107. //当表单提交时 调用所有的校验方法
    108. $("#registerForm").submit(function () {
    109. return checkUsername() && checkPassword() && checkEamil() && checkName() && checkTelephone() && checkBirthday() && checkCheck();
    110. //如果这个方法没有返回值 或者返回值为true 则表单提交 如果返回为false 则表单不提交
    111. })
    112. //当某一个组件失去焦点时 调用对应的方法
    113. $("#username").blur(checkUsername);
    114. $("#password").blur(checkPassword);
    115. $("#email").blur(checkEamil);
    116. $("#name").blur(checkName);
    117. $("#telephone").blur(checkTelephone);
    118. $("#birthday").blur(checkBirthday);
    119. $("#check").blur(checkCheck);
    120. })
    121. </script>

    🍀 异步提交表单

    在此使用异步提交表单是为了获取服务器响应的数据。因为我们前台使用的是html作为视图层,不能够直接从servlet相关的域对象获取值,只能通过ajax获取响应数据

     效果图

    🍀 Servlet代码实现

    编写RegistUserServlet

    1. package cn.itcast.travel.web.servlet;
    2. import cn.itcast.travel.domain.ResultInfo;
    3. import cn.itcast.travel.domain.User;
    4. import cn.itcast.travel.service.UserService;
    5. import cn.itcast.travel.service.impl.UserServiceImpl;
    6. import com.fasterxml.jackson.databind.ObjectMapper;
    7. import org.apache.commons.beanutils.BeanUtils;
    8. import javax.servlet.ServletException;
    9. import javax.servlet.annotation.WebServlet;
    10. import javax.servlet.http.HttpServlet;
    11. import javax.servlet.http.HttpServletRequest;
    12. import javax.servlet.http.HttpServletResponse;
    13. import java.io.IOException;
    14. import java.lang.reflect.InvocationTargetException;
    15. import java.util.Map;
    16. /**
    17. * @Author wang
    18. * @Date 2022/5/23 16:18
    19. * @PackageName:${PACKAGE_NAME}
    20. * @ClassName: ${NAME}
    21. * @Description: TODO
    22. * @Version 1.0
    23. */
    24. @WebServlet("/registUserServlet")
    25. public class RegistUserServlet extends HttpServlet {
    26. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    27. //1.获取数据
    28. Map<String, String[]> map = request.getParameterMap();
    29. //2.封装对象
    30. User user = new User();
    31. try {
    32. BeanUtils.populate(user, map);
    33. } catch (IllegalAccessException e) {
    34. e.printStackTrace();
    35. } catch (InvocationTargetException e) {
    36. e.printStackTrace();
    37. }
    38. //3.调用service完成注册
    39. UserService service = new UserServiceImpl();
    40. boolean flag = service.regist(user);
    41. ResultInfo userInfo = new ResultInfo();
    42. //4.响应结果
    43. if (flag) {
    44. //注册成功
    45. userInfo.setFlag(true);
    46. } else {
    47. //注册失败
    48. userInfo.setFlag(false);
    49. userInfo.setErrorMsg("注册失败");
    50. }
    51. //将info对象序列化为json
    52. ObjectMapper mapper = new ObjectMapper();
    53. String json = mapper.writeValueAsString(userInfo);
    54. //将json数据写回客户端
    55. //设置content-type
    56. response.setContentType("application/json;charset=utf-8");
    57. // response.getOutputStream().write(json.getBytes());
    58. response.getWriter().write(json);
    59. }
    60. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    61. this.doPost(request, response);
    62. }
    63. }
    UserService

    UserServiceImpl

    🍀 Dao代码实现

    UserDao

    UserDaoImpl
    1. package cn.itcast.travel.dao.impl;
    2. import cn.itcast.travel.dao.UserDao;
    3. import cn.itcast.travel.domain.User;
    4. import cn.itcast.travel.util.JDBCUtils;
    5. import org.springframework.jdbc.core.BeanPropertyRowMapper;
    6. import org.springframework.jdbc.core.JdbcTemplate;
    7. /**
    8. * @Author wang
    9. * @Date 2022/5/23 16:23
    10. * @PackageName:cn.itcast.travel.dao.impl
    11. * @ClassName: UserDaoImpl
    12. * @Description: TODO
    13. * @Version 1.0
    14. */
    15. public class UserDaoImpl implements UserDao {
    16. private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    17. @Override
    18. public User findByUsername(String username) {
    19. //1.定义sql
    20. String sql = "select * from tab_user where username = ?";
    21. //2.执行sql
    22. User user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username);
    23. return user;
    24. }
    25. @Override
    26. public void save(User user) {
    27. //1.定义sql
    28. String sql = "insert into tab_user(username,password,name,birthday,sex,telephone,email) values(?,?,?,?,?,?,?)";
    29. //2.执行sql
    30. template.update(sql,
    31. user.getUsername(),
    32. user.getPassword(),
    33. user.getName(),
    34. user.getBirthday(),
    35. user.getSex(),
    36. user.getTelephone(),
    37. user.getEmail());
    38. }
    39. }

    🍀 service代码实现&测试

    UserServiceImpl
    1. package cn.itcast.travel.service.impl;
    2. import cn.itcast.travel.dao.UserDao;
    3. import cn.itcast.travel.dao.impl.UserDaoImpl;
    4. import cn.itcast.travel.domain.User;
    5. import cn.itcast.travel.service.UserService;
    6. /**
    7. * @Author wang
    8. * @Date 2022/5/23 16:22
    9. * @PackageName:cn.itcast.travel.service.impl
    10. * @ClassName: UserServiceImpl
    11. * @Description: TODO
    12. * @Version 1.0
    13. */
    14. public class UserServiceImpl implements UserService {
    15. private UserDao userDao = new UserDaoImpl();
    16. @Override
    17. public boolean regist(User user) {
    18. //1.根据用户名查询用户对象
    19. User u = userDao.findByUsername(user.getUsername());
    20. //判断u是否为null
    21. if (u != null) {
    22. //用户名存在 注册失败
    23. return false;
    24. }
    25. //2.保存用户对象
    26. userDao.save(user);
    27. return true;
    28. }
    29. }

    代码健壮性校验

     测试效果图

    在测试的过程中 如果控制台错误日志 原因解决

    🍀 后台_验证码&前台数据处理

    但是在之前的表单中 是没有校验验证码的 正常是要先校验验证码 才能进行下一步的注册

    RegistUserServlet
    1. @WebServlet("/registUserServlet")
    2. public class RegistUserServlet extends HttpServlet {
    3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. //验证码校验
    5. String check = request.getParameter("check");
    6. //从session中获取验证码
    7. HttpSession session = request.getSession();
    8. String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
    9. session.removeAttribute("CHECKCODE_SERVER");//为了保证验证码只能使用一次
    10. //比价
    11. if (checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)){
    12. ResultInfo userInfo = new ResultInfo();
    13. //验证码校验失败
    14. userInfo.setFlag(false);
    15. userInfo.setErrorMsg("验证码错误");
    16. //将info对象序列化为json
    17. ObjectMapper mapper = new ObjectMapper();
    18. String json = mapper.writeValueAsString(userInfo);
    19. //将json数据写回客户端
    20. //设置content-type
    21. response.setContentType("application/json;charset=utf-8");
    22. response.getWriter().write(json);
    23. return;
    24. }
    25. //1.获取数据
    26. Map<String, String[]> map = request.getParameterMap();
    27. .......
    28. .......
    29. .......
    register.html
    1. $(function () {
    2. //当表单提交时 调用所有的校验方法
    3. $("#registerForm").submit(function () {
    4. //1.发送数据到服务器
    5. if (checkUsername() && checkPassword() && checkEamil() && checkName() && checkTelephone() && checkBirthday() && checkCheck()) {
    6. //校验通过 发送ajax请求 提交表单的数据 usernamezhangsan & password=123
    7. $.post('registUserServlet', $(this).serialize(), function (data) {
    8. //处理服务器响应的数据 data:{flag:true,errorMsg:'注册失败'}
    9. if (data.flag) {
    10. //注册成功 跳转页面
    11. location.href = "register_ok.html";
    12. } else {
    13. //注册失败 给error添加提示信息
    14. $("#errorMsg").html(data.errorMsg)
    15. }
    16. })
    17. }
    <div id="errorMsg" style="color: red;text-align: center;font-size: 25px;"></div>
    
    <!--注册表单-->

    测试效果图

    🍀 后台_邮件激活分析

    邮件激活

            为什么要进行邮件激活?为了保证用户填写的邮箱是正确的。将来可以推广一些宣传信息,到用户邮箱中

    🍀 邮件激活_发送邮件

    1. 申请邮箱
    2. 开启授权码
    3. 在MailUtils中设置自己的邮箱账号和密码(授权码)

    邮件工具类:MailUtils,调用其中sendMail方法可以完成邮件发送

    效果图

    🍀 邮件激活_点击激活分析

    经过分析,发现,用户激活其实就是修改用户表中的status为‘Y’

    UserServiceImpl
    1. public class UserServiceImpl implements UserService {
    2. private UserDao userDao = new UserDaoImpl();
    3. @Override
    4. public boolean regist(User user) {
    5. //1.根据用户名查询用户对象
    6. User u = userDao.findByUsername(user.getUsername());
    7. //判断u是否为null
    8. if (u != null) {
    9. //用户名存在 注册失败
    10. return false;
    11. }
    12. //2.保存用户对象
    13. //2.1设置激活码
    14. user.setCode(UuidUtil.getUuid());
    15. //2.2设置激活状态
    16. user.setStatus("N");
    17. userDao.save(user);
    18. //激活邮件发送 邮件正文
    19. String content = "<a href = ‘http://localhost:8888/travel/activeUserServlet?code=" + user.getCode() + "’>点击激活[黑马旅游网]</a>";
    20. MailUtils.sendMail(user.getEmail(), content, "激活邮件");
    21. return true;
    22. }
    23. }

    测试效果图

    🍀 邮件激活代码实现Servlet

    ActiveUserServlet
    1. package cn.itcast.travel.web.servlet;
    2. import cn.itcast.travel.service.UserService;
    3. import cn.itcast.travel.service.impl.UserServiceImpl;
    4. import javax.servlet.ServletException;
    5. import javax.servlet.annotation.WebServlet;
    6. import javax.servlet.http.HttpServlet;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. import java.io.IOException;
    10. /**
    11. * @Author wang
    12. * @Date 2022/5/24 10:20
    13. * @PackageName:${PACKAGE_NAME}
    14. * @ClassName: ${NAME}
    15. * @Description: TODO
    16. * @Version 1.0
    17. */
    18. @WebServlet("/activeUserServlet")
    19. public class ActiveUserServlet extends HttpServlet {
    20. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    21. //1.获取激活码
    22. String code = request.getParameter("code");//获取通过http协议提交过来的数据. 不仅仅代表表单提交 而且有自定义参数
    23. if (code != null) {
    24. //2.调用service完成激活
    25. UserService service = new UserServiceImpl();
    26. boolean flag = service.active(code);
    27. //3。判断标记
    28. String msg = "";
    29. if (flag) {//激活成功
    30. msg = "激活成功 请<a href='login.html'>登录</a>";
    31. } else {
    32. //激活失败
    33. msg = "激活失败,请联系管理员!";
    34. }
    35. response.setContentType("text/html;charset=utf-8");
    36. response.getWriter().write(msg);
    37. }
    38. }
    39. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    40. this.doPost(request, response);
    41. }
    42. }

    🍀 邮件激活代码实现Service&Dao

    UserService

    UserServiceImpl
    
    1. @Override
    2. public boolean active(String code) {
    3. //1.根据激活码查询用户对象
    4. User user = userDao.findByCode(code);
    5. if (user != null) {
    6. userDao.updateStatus(user);
    7. return true;
    8. } else {
    9. return false;
    10. }
    11. }
    UserDao

    UserDaoImpl
    1. /**
    2. * 保存用户对象
    3. *
    4. * @param user
    5. */
    6. @Override
    7. public void save(User user) {
    8. //1.定义sql
    9. String sql = "insert into tab_user(username,password,name,birthday,sex,telephone,email,status,code) values(?,?,?,?,?,?,?,?,?)";
    10. //2.执行sql
    11. template.update(sql,
    12. user.getUsername(),
    13. user.getPassword(),
    14. user.getName(),
    15. user.getBirthday(),
    16. user.getSex(),
    17. user.getTelephone(),
    18. user.getEmail(),
    19. user.getStatus(),
    20. user.getCode()
    21. );
    22. }
    23. /**
    24. * 根据激活码查询用户对象
    25. *
    26. * @param code
    27. * @return
    28. */
    29. @Override
    30. public User findByCode(String code) {
    31. String sql = "select * from tab_user where code = ?";
    32. //当sql的返回对象 要么只有一个要么没有的时候 使用方法 queryForObject() 这个方法如果没有查出来时 会出异常 不会返回null
    33. User user = null;
    34. try {
    35. user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), code);
    36. } catch (DataAccessException e) {
    37. e.printStackTrace();
    38. }
    39. return user;
    40. }
    41. /**
    42. * 修改用户的激活状态
    43. *
    44. * @param user
    45. */
    46. @Override
    47. public void updateStatus(User user) {
    48. String sql = "update tab_user set status = 'Y' where uid = ?";
    49. template.update(sql, user.getUid());
    50. }

    效果图

  • 相关阅读:
    Rockland甘油激酶抗体生物素偶联物丨山羊多克隆
    图片懒加载
    数据库工程师的工作职责(合集)
    “Invalid project description“问题解决
    浏览器缓存机制
    智能终端测试解决方案
    cmake配置opencv与boost库
    Java线程常见方法
    StackExchange.Redis 高并发下timeout超时问题如何解决?
    第2-4-3章 规则引擎Drools基础语法-业务规则管理系统-组件化-中台
  • 原文地址:https://blog.csdn.net/nanyangnongye/article/details/124913744