Browse Source

注册发送邮件,添加验证码完善前端页面

薛晓波 6 years ago
parent
commit
d6b22df9ed

+ 32 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/configure/ErrorPageConfig.java

@@ -0,0 +1,32 @@
+package cn.iselab.mooctest.user.configure;
+
+import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
+import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
+import org.springframework.boot.context.embedded.ErrorPage;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpStatus;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.27 14:54
+ */
+@Configuration
+public class ErrorPageConfig {
+
+    @Bean
+    public EmbeddedServletContainerCustomizer containerCustomizer(){
+        return new EmbeddedServletContainerCustomizer() {
+            @Override
+            public void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) {
+                ErrorPage errorPage400 = new ErrorPage(HttpStatus.BAD_REQUEST, "/error-400");
+                ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-404");
+                ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error-500");
+                configurableEmbeddedServletContainer.addErrorPages(
+                        errorPage400,
+                        errorPage404,
+                        errorPage500);
+            }
+        };
+    }
+}

+ 14 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/data/Callback.java

@@ -0,0 +1,14 @@
+package cn.iselab.mooctest.user.data;
+
+import cn.iselab.mooctest.user.constants.UrlConstants;
+import lombok.Data;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.27 12:36
+ */
+@Data
+public class Callback {
+    private String redirectURL;
+    private String defaultURL = UrlConstants.DFAULT_GOTO;
+}

+ 18 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/mapper/VerifyCodeDao.java

@@ -0,0 +1,18 @@
+package cn.iselab.mooctest.user.mapper;
+
+import cn.iselab.mooctest.user.model.VerifyCode;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.28 1:16
+ */
+@Transactional
+public interface VerifyCodeDao extends CrudRepository<VerifyCode, Long>, JpaSpecificationExecutor<VerifyCode> {
+
+    VerifyCode findTop1ByTypeAndReceiverOrderByCreateTimeDesc(String type, String receiver);
+}

+ 38 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/model/VerifyCode.java

@@ -0,0 +1,38 @@
+package cn.iselab.mooctest.user.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.28 0:57
+ */
+@Data
+@Entity
+@Table(name = "verify_code")
+public class VerifyCode {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "code")
+    private String code;
+
+    /**
+     * type=email or mobile
+     */
+    @Column(name = "type")
+    private String type;
+
+    @Column(name = "recevier")
+    private String receiver;
+
+    @Column(name = "create_time")
+    private Timestamp createTime;
+
+    @Column(name = "expired_time")
+    private Timestamp expiredTime;
+}

+ 6 - 1
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/MailService.java

@@ -1,5 +1,7 @@
 package cn.iselab.mooctest.user.service;
 
+import javax.mail.MessagingException;
+
 /**
  * @Description: 发送邮件服务接口
  * @Author: xuexb
@@ -10,5 +12,8 @@ public interface MailService {
     void sendNormalEmail(String sender, String receiver,
                          String subject, String content);
 
-    void sendRegisterEmail(String sender, String receiver);
+    void sendHtmlEmail(String sender, String receiver,
+                         String subject, String content) throws MessagingException;
+
+    void sendVerifyEmail(String sender, String receiver, String code) throws MessagingException;
 }

+ 16 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/VerifyCodeService.java

@@ -0,0 +1,16 @@
+package cn.iselab.mooctest.user.service;
+
+import cn.iselab.mooctest.user.model.VerifyCode;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.28 1:27
+ */
+public interface VerifyCodeService {
+
+    VerifyCode getLatestVerifyCode(String type, String receiver);
+
+    VerifyCode saveVerifyCode(VerifyCode verifyCode);
+
+    boolean validateVerifyCode(String type, String receiver, String code);
+}

+ 37 - 1
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/MailServiceImpl.java

@@ -1,12 +1,23 @@
 package cn.iselab.mooctest.user.service.impl;
 
 import cn.iselab.mooctest.user.service.MailService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.mail.MailException;
 import org.springframework.mail.SimpleMailMessage;
 import org.springframework.mail.javamail.JavaMailSender;
 import org.springframework.mail.javamail.JavaMailSenderImpl;
+import org.springframework.mail.javamail.MimeMailMessage;
+import org.springframework.mail.javamail.MimeMessageHelper;
 import org.springframework.stereotype.Service;
+import org.thymeleaf.TemplateEngine;
+import org.thymeleaf.context.Context;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import java.io.UnsupportedEncodingException;
 
 /**
  * @Description: 作用描述
@@ -16,9 +27,14 @@ import org.springframework.stereotype.Service;
 @Service
 public class MailServiceImpl implements MailService {
 
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+
     @Autowired
     private JavaMailSender mailSender;
 
+    @Autowired
+    TemplateEngine templateEngine;
+
     @Override
     public void sendNormalEmail(String sender, String receiver, String subject, String content) {
         SimpleMailMessage message = new SimpleMailMessage();
@@ -31,7 +47,27 @@ public class MailServiceImpl implements MailService {
     }
 
     @Override
-    public void sendRegisterEmail(String sender, String receiver) {
+    public void sendHtmlEmail(String sender, String receiver, String subject, String content) throws MessagingException {
+        MimeMessage message = mailSender.createMimeMessage();
+        MimeMessageHelper helper = new MimeMessageHelper(message,true);
+        try {
+            helper.setFrom(sender, "慕测科技");
+        } catch (UnsupportedEncodingException e) {
+            logger.error("设置发件人名称出错", e);
+        }
+        helper.setTo(receiver);
+        helper.setSubject(subject);
+        helper.setText(content, true);
+        mailSender.send(message);
 
     }
+
+
+    @Override
+    public void sendVerifyEmail(String sender, String receiver, String code) throws MessagingException {
+        Context context = new Context();
+        context.setVariable("verifyCode", "2333");
+        String emailContent = templateEngine.process("email/verify_mail", context);
+        sendHtmlEmail(sender,receiver, "【验证码-慕测科技】", emailContent);
+    }
 }

+ 39 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/VerifyCodeServiceImpl.java

@@ -0,0 +1,39 @@
+package cn.iselab.mooctest.user.service.impl;
+
+import cn.iselab.mooctest.user.mapper.VerifyCodeDao;
+import cn.iselab.mooctest.user.model.VerifyCode;
+import cn.iselab.mooctest.user.service.VerifyCodeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: xuexb
+ * @Date: 2018.12.28 1:32
+ */
+@Service
+public class VerifyCodeServiceImpl implements VerifyCodeService {
+
+    @Autowired
+    private VerifyCodeDao verifyCodeDao;
+
+    @Override
+    public VerifyCode getLatestVerifyCode(String type, String receiver) {
+        return verifyCodeDao.findTop1ByTypeAndReceiverOrderByCreateTimeDesc(type, receiver);
+    }
+
+    @Override
+    public VerifyCode saveVerifyCode(VerifyCode verifyCode) {
+        return verifyCodeDao.save(verifyCode);
+    }
+
+    @Override
+    public boolean validateVerifyCode(String type, String receiver, String code) {
+        VerifyCode latestVerifyCode = getLatestVerifyCode(type, receiver);
+        if (latestVerifyCode != null &&
+                latestVerifyCode.getExpiredTime().getTime() > System.currentTimeMillis() &&
+                (latestVerifyCode.getCode().equals(code))){
+            return true;
+        }
+        return false;
+    }
+}

+ 28 - 7
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/ctrl/PageController.java

@@ -3,6 +3,7 @@ package cn.iselab.mooctest.user.web.ctrl;
 import cn.iselab.mooctest.rpc.user.data.UserDTO;
 import cn.iselab.mooctest.user.constants.ResponseStatus;
 import cn.iselab.mooctest.user.constants.UrlConstants;
+import cn.iselab.mooctest.user.data.Callback;
 import cn.iselab.mooctest.user.data.ResponseResult;
 import cn.iselab.mooctest.user.util.EncryptionUtil;
 import cn.iselab.mooctest.user.web.logic.UserLogic;
@@ -27,16 +28,18 @@ public class PageController extends BaseController{
     UserLogic userLogic;
 
     @RequestMapping(value = UrlConstants.PAGE + "login", method = RequestMethod.GET)
-    public String login(String afterLogin, HttpServletRequest request){
-        System.out.println("\n"+afterLogin+"\n\n");
-        if(afterLogin!=null && afterLogin.trim().length()>0){
-            if(!afterLogin.startsWith("http"))
-                afterLogin = "http://"+afterLogin;
-        }else
+    public String login(Callback callback, HttpServletRequest request){
+        String afterLogin = null;
+        if(callback.getRedirectURL()!=null && callback.getRedirectURL().trim().length()>0){
+            if(!callback.getRedirectURL().startsWith("http"))
+                callback.setRedirectURL("http://"+callback);
+            afterLogin = callback.getRedirectURL();
+        }else if(callback.getDefaultURL()!=null)
+            afterLogin = callback.getDefaultURL();
+        else
             afterLogin = UrlConstants.DFAULT_GOTO;
 
         LOG.info("RedirectURL---" + afterLogin);
-
         HttpSession session = request.getSession();
         session.setAttribute("redirectURL", afterLogin);
         if(session.getAttribute("userId")!=null){
@@ -76,6 +79,24 @@ public class PageController extends BaseController{
         return null;
     }
 
+    @RequestMapping("error-404")
+    public String toPage404(Model model){
+        model.addAttribute("message", "老铁,你的页面飞走了!\n404 Not Fount");
+        return "error_page";
+    }
+
+    @RequestMapping("error-400")
+    public String toPage400(Model model){
+        model.addAttribute("message", "对不起,你的请求出错了!\n400 Bad Request");
+        return "error_page";
+    }
+
+    @RequestMapping("error-500")
+    public String toPage500(Model model){
+        model.addAttribute("message", "大侠,系统出现了错误!\n500 Error");
+        return "error_page";
+    }
+
 
 
 

+ 27 - 8
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/ctrl/TestController.java

@@ -1,5 +1,9 @@
 package cn.iselab.mooctest.user.web.ctrl;
 
+import cn.iselab.mooctest.rpc.user.data.UserDTO;
+import cn.iselab.mooctest.user.constants.ResponseStatus;
+import cn.iselab.mooctest.user.data.Callback;
+import cn.iselab.mooctest.user.data.ResponseResult;
 import cn.iselab.mooctest.user.service.MailService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.ui.Model;
@@ -7,6 +11,7 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
 import javax.annotation.Resource;
+import javax.mail.MessagingException;
 import javax.servlet.http.HttpServletRequest;
 import java.rmi.MarshalledObject;
 import java.util.HashMap;
@@ -17,7 +22,7 @@ import java.util.Map;
  * @Date: 2018.12.24 19:11
  */
 @RestController
-public class TestController {
+public class TestController extends BaseController{
 
     @Autowired
     MailService mailService;
@@ -38,10 +43,18 @@ public class TestController {
         return map;
     }
 
-    @RequestMapping(value = "/test/mail", method = RequestMethod.GET)
-    public void sendMail(){
-        mailService.sendNormalEmail("", "171256175@qq.com",
-                "[TEST]测试邮件", "这是一封测试邮件<a href='https://www.baidu.com'/>");
+    @RequestMapping(value = "/test/mail", method = RequestMethod.POST)
+    public ResponseResult<Object> sendMail(UserDTO userDTO){
+        ResponseResult<Object> result = new ResponseResult<>();
+        System.out.println("\nreceiver: "+userDTO.getEmail()+"\n");
+        try {
+            mailService.sendVerifyEmail("diors_po@126.com", "171256175@qq.com", "1234");
+            result.init(ResponseStatus.SUCCESS, "发送成功", null);
+        } catch (MessagingException e) {
+            result.init(ResponseStatus.FAILED, "发送失败", null);
+            LOG.error("发送邮件出错",e);
+        }
+        return result;
     }
 
     @RequestMapping(value = "/test/error", method = RequestMethod.GET)
@@ -58,12 +71,18 @@ public class TestController {
 
     @RequestMapping(value = "/test/register", method = RequestMethod.GET)
     public ModelAndView registerPage(){
+        // ResponseResult<Object> result = new ResponseResult<>();
+        // result.init(1000, "哈哈哈哈哈", null);
+        // model.addAttribute("result", result);
         return new ModelAndView("register");
     }
 
-    @RequestMapping(value = "/test/get", method = RequestMethod.GET)
-    public String test(@RequestBody String afterLogin){
-        return afterLogin;
+    @RequestMapping(value = "/test/get", method = RequestMethod.POST)
+    public String test(Callback afterLogin){
+        System.out.println("\nafterLogin====="+afterLogin.getRedirectURL()+"\n");
+        System.out.println("\nafterLogin====="+afterLogin.getDefaultURL()+"\n");
+
+        return afterLogin.getRedirectURL();
     }
 
 

+ 9 - 1
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/ctrl/UserController.java

@@ -70,9 +70,17 @@ public class UserController extends BaseController {
             LOG.info("用户成功退出--userId--"+(Long)userId);
         } else{
             result.init(ResponseStatus.FAILED, "用户未登录", null);
-            LOG.info("用户未登录");
+            LOG.info(result.getMsg());
         }
         return result;
     }
 
+    @RequestMapping(value = UrlConstants.API + "mail/verify", method = RequestMethod.POST)
+    public ResponseResult<Object> sendVerifyEmail(UserDTO userDTO){
+        ResponseResult<Object> result = new ResponseResult<>();
+
+        return null;
+    }
+
+
 }

+ 1 - 1
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/UserLogic.java

@@ -38,7 +38,7 @@ public interface UserLogic {
 
     ResponseResult<UserDTO> registerAccount(UserDTO userDTO);
 
-    ResponseResult<UserDTO> activeAccount(String email);
+    ResponseResult<String> sendVerifyEmail(UserDTO userDTO);
 
 
 

+ 23 - 3
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/impl/UserLogicImpl.java

@@ -266,9 +266,29 @@ public class UserLogicImpl extends BaseLogic implements UserLogic {
     }
 
     @Override
-    public ResponseResult<UserDTO> activeAccount(String email) {
+    public ResponseResult<String> sendVerifyEmail(UserDTO userDTO) {
+        String receiver = userDTO.getEmail();
+        ResponseResult<String> result = new ResponseResult<>();
+        if(userService.findByEmail(userDTO.getEmail()) != null){
+            result.init(ResponseStatus.FAILED, "该邮箱已被注册", receiver);
+            LOG.error(result.getMsg());
+            return result;
+        }
+        if (!EmailValidator.getInstance().isValid(userDTO.getEmail())){
+            result.init(ResponseStatus.FAILED, "注册邮箱非法", receiver);
+            LOG.error(result.getMsg());
+            return result;
+        }
+        if (userDTO.getName().length()>50 || userDTO.getName().length()<2){
+            result.init(ResponseStatus.FAILED, "姓名长度非法,应在2~50位", userDTO.getName());
+            LOG.error(result.getMsg());
+            return result;
+        }
+        if (userDTO.getPassword().length() > 16 || userDTO.getPassword().length() < 6){
+            result.init(ResponseStatus.FAILED, "密码长度非法,应在6~16位", userDTO.getPassword());
+            LOG.error(result.getMsg());
+            return result;
+        }
         return null;
     }
-
-
 }

+ 11 - 0
mooctest-user-server/src/main/resources/templates/email/verify_mail.html

@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>【慕测科技】验证邮件</title>
+</head>
+<body>
+尊敬的用户:<br>
+您好,这是一封验证邮件,您的验证码为:<span style="color: #138496" th:text="${verifyCode}"></span>
+</body>
+</html>

+ 52 - 8
mooctest-user-server/src/main/resources/templates/register.html

@@ -22,7 +22,7 @@
 <div class="limiter">
     <div class="container-login100" th:style="'background-image:url(/images/bg.jpg);'">
         <div class="wrap-login100 p-l-40 p-r-40 p-t-30 p-b-25">
-            <form th:action="@{/page/dologin}" method="post" class="login100-form validate-form">
+            <form th:action="@{/page/doregister}" method="post" class="login100-form validate-form">
                 <div id="login-logo" style="text-align: center;">
                     <img style="width: 80px;" th:src="@{/images/mooctest.png}" >
                 </div>
@@ -31,13 +31,13 @@
 
                 <div class="wrap-input100 validate-input" data-validate="请输入邮箱">
                     <!--<span class="label-input100">邮箱</span>-->
-                    <input class="input100" type="email" name="email" placeholder="请输入邮箱" required="邮箱不可为空">
+                    <input class="input100" type="email" id="email" name="email" placeholder="请输入邮箱" required="邮箱不可为空">
                     <span class="focus-input100" data-symbol="&#xf206;"></span>
                 </div>
 
                 <div class="wrap-input100 validate-input " data-validate="请输入姓名">
                     <!--<span class="label-input100">姓名</span>-->
-                    <input class="input100" type="text" name="email" placeholder="请输入姓名" required="邮箱不可为空">
+                    <input class="input100" type="text" name="username" placeholder="请输入姓名" required="邮箱不可为空">
                     <span class="focus-input100" data-symbol="&#xf197;"></span>
                 </div>
 
@@ -52,19 +52,19 @@
                     <input class="input100" type="password" name="password2" placeholder="请确认密码" required="密码不可为空">
                     <span class="focus-input100" data-symbol="&#xf190;"></span>
                 </div>
-                <div class="wrap-input100 validate-input" data-validate="请输入邮箱验证码">
-                    <input class="input100" type="password" name="password2" placeholder="请输入邮箱验证码" required="验证码不可为空">
+
+                <div class="wrap-input100 validate-input " data-validate="请输入验证码">
+                    <input class="input100" type="text" name="username" placeholder="请输入验证码" required="验证码不可为空">
                     <span class="focus-input100" data-symbol="&#xf13a;"></span>
                 </div>
-
                 <div class="text-center p-t-6 p-b-8">
-                    <span style="color: red" th:unless="${result==null}" th:text="${result.msg}"></span>
+                    <span id="info" style="color: red">sssss</span>
                 </div>
 
                 <div class="container-login100-form-btn" style="width: 50%; float: left;">
                     <div class="wrap-login100-form-btn">
                         <div class="login100-form-bgbtn"></div>
-                        <button class="login100-form-btn">发送验证码</button>
+                        <button type="button"  id="sendVerify" class="login100-form-btn" onclick="sendEmail(this)" >获取验证码</button>
                     </div>
                 </div>
                 <div class="container-login100-form-btn">
@@ -84,5 +84,49 @@
 
 <script th:src="@{/vendor/jquery/jquery-3.2.1.min.js}"></script>
 <script th:src="@{/js/main.js}"></script>
+<script type="text/javascript">
+var countdown = 60;
+function sendEmail(obj) {
+    var email = $("#email").val();
+    if (email == null || email.trim() == "") {
+        document.getElementById("info").innerText = "邮箱不能为空";
+
+        return;
+    }
+    var data = {"email":email};
+    $.ajax({
+        url:"/test/mail",
+        type:"POST",
+        data:data,
+        timeout: 3000,
+        success:function (result) {
+            console.log(result);
+            if (result.status != 2000) {
+                alert("发送失败, 原因:"+result.msg);
+            }else{
+                alert("发送成功,请前往邮箱查收!");
+                settime(obj);
+            }
+        }
+    })
+}
+function settime(obj) {
+    if (countdown == 0) {
+        obj.removeAttribute("disabled");
+        obj.innerText="获取验证码";
+        countdown = 60;
+        return;
+    } else {
+        obj.setAttribute("disabled", true);
+        obj.innerText="重新发送(" + countdown + ")";
+        countdown--;
+    }
+    setTimeout(function() {
+            settime(obj) }
+        ,1000)
+}
+</script>
 </body>
 </html>
+
+