Browse Source

添加账户中心后台审核通知功能

huxz 7 years ago
parent
commit
c7f9d5a218

+ 1 - 0
sso-manage-console/build.gradle

@@ -27,6 +27,7 @@ dependencies {
   compile("org.springframework.boot:spring-boot-starter-thymeleaf")
   compile("org.springframework.boot:spring-boot-starter-thymeleaf")
   compile("org.springframework.boot:spring-boot-starter-data-jpa")
   compile("org.springframework.boot:spring-boot-starter-data-jpa")
   compile("org.springframework.boot:spring-boot-starter-actuator")
   compile("org.springframework.boot:spring-boot-starter-actuator")
+  compile("org.springframework.boot:spring-boot-starter-mail")
   compile("net.sourceforge.nekohtml:nekohtml:1.9.15")
   compile("net.sourceforge.nekohtml:nekohtml:1.9.15")
 
 
   compile('commons-codec:commons-codec:1.11')
   compile('commons-codec:commons-codec:1.11')

+ 39 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/MailService.java

@@ -0,0 +1,39 @@
+package com.uas.sso.sso.backend.service;
+
+import java.util.Map;
+
+/**
+ * Service class is used for sending email to notify peoples.
+ *
+ * @author huxz
+ */
+public interface MailService {
+
+    /**
+     * Send simple mail.
+     *
+     * @param to    receipts
+     * @param subject   subject of mail
+     * @param content   content of mail
+     */
+    void sendSimpleMail(String to, String subject, String content);
+
+    /**
+     * Send an html mail.
+     *
+     * @param to receipt
+     * @param subject   subject of mail
+     * @param content   content of mail
+     */
+    void sendHtmlMail(String to, String subject, String content);
+
+    /**
+     * Send a mail with html template.
+     *
+     * @param to    receipt
+     * @param subject   subject of mail
+     * @param params    the params which template needs
+     * @param templateName  name of html template
+     */
+    void sendTemplateMail(String to, String subject, Map<String, String> params, String templateName);
+}

+ 52 - 1
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/AppealServiceImpl.java

@@ -4,6 +4,7 @@ import static com.uas.sso.sso.backend.AuthenticationUtils.getEncryPassword;
 
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.sso.core.Const;
 import com.uas.sso.core.Const;
+import com.uas.sso.core.ICallable;
 import com.uas.sso.dao.AppealDao;
 import com.uas.sso.dao.AppealDao;
 import com.uas.sso.dao.UserDao;
 import com.uas.sso.dao.UserDao;
 import com.uas.sso.dao.UserspaceDao;
 import com.uas.sso.dao.UserspaceDao;
@@ -16,12 +17,15 @@ import com.uas.sso.sso.backend.entity.AdminChangeRecord;
 import com.uas.sso.sso.backend.entity.AdminChangeType;
 import com.uas.sso.sso.backend.entity.AdminChangeType;
 import com.uas.sso.sso.backend.exceptions.ValidationFailedException;
 import com.uas.sso.sso.backend.exceptions.ValidationFailedException;
 import com.uas.sso.sso.backend.service.AppealService;
 import com.uas.sso.sso.backend.service.AppealService;
+import com.uas.sso.sso.backend.service.MailService;
 import com.uas.sso.sso.backend.service.UserBackendService;
 import com.uas.sso.sso.backend.service.UserBackendService;
 import com.uas.sso.sso.backend.util.JacksonUtils;
 import com.uas.sso.sso.backend.util.JacksonUtils;
+import com.uas.sso.util.ExecuteUtils;
 import java.sql.Timestamp;
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.Date;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -67,14 +71,17 @@ public class AppealServiceImpl implements AppealService {
 
 
     private final UserBackendService userService;
     private final UserBackendService userService;
 
 
+    private final MailService mailService;
+
     @Autowired
     @Autowired
     public AppealServiceImpl(AppealDao appealDao, UserDao userDao,
     public AppealServiceImpl(AppealDao appealDao, UserDao userDao,
-                             UserspaceDao spaceDao, AdminChangeRecordDao recordDao, UserBackendService userService) {
+                             UserspaceDao spaceDao, AdminChangeRecordDao recordDao, UserBackendService userService, MailService mailService) {
         this.appealDao = appealDao;
         this.appealDao = appealDao;
         this.userDao = userDao;
         this.userDao = userDao;
         this.spaceDao = spaceDao;
         this.spaceDao = spaceDao;
         this.recordDao = recordDao;
         this.recordDao = recordDao;
         this.userService = userService;
         this.userService = userService;
+        this.mailService = mailService;
     }
     }
 
 
     @Override
     @Override
@@ -137,6 +144,18 @@ public class AppealServiceImpl implements AppealService {
         appealDao.save(appeal);
         appealDao.save(appeal);
 
 
         if (!isPass) {
         if (!isPass) {
+            String spaceName = null;
+            if (CHANGE_ADMIN.equals(appeal.getType())) {
+                JSONObject jsonObject = JacksonUtils.fromJson(appeal.getSubmitInfo(), JSONObject.class);
+                Assert.notNull(jsonObject, "更换管理员提交信息不能为空");
+
+                Userspace userSpace = jsonObject.getObject("userspace", Userspace.class);
+                Assert.notNull(userSpace, "更换管理员的企业信息不能为空");
+                Assert.notNull(userSpace.getSpaceUU(), "更换管理员申诉企业UU不能为空");
+
+                spaceName = userSpace.getSpaceName();
+            }
+            synSendMail(appeal.getContactEmail(), appeal.getType(), appeal.getContactName(), spaceName, isPass);
             return;
             return;
         }
         }
 
 
@@ -157,6 +176,8 @@ public class AppealServiceImpl implements AppealService {
                 user.setPassword(getEncryPassword(Const.ENCRY_FORMAT, password, user.getSalt()));
                 user.setPassword(getEncryPassword(Const.ENCRY_FORMAT, password, user.getSalt()));
             }
             }
             userDao.save(user);
             userDao.save(user);
+
+            synSendMail(appeal.getContactEmail(), appeal.getType(), appeal.getContactName(), null, isPass);
         } else if (CHANGE_ADMIN.equals(appeal.getType())) {
         } else if (CHANGE_ADMIN.equals(appeal.getType())) {
             JSONObject jsonObject = JacksonUtils.fromJson(appeal.getSubmitInfo(), JSONObject.class);
             JSONObject jsonObject = JacksonUtils.fromJson(appeal.getSubmitInfo(), JSONObject.class);
             Assert.notNull(jsonObject, "更换管理员提交信息不能为空");
             Assert.notNull(jsonObject, "更换管理员提交信息不能为空");
@@ -216,11 +237,41 @@ public class AppealServiceImpl implements AppealService {
             // 更新企业认证状态
             // 更新企业认证状态
             space.setValidCode((short) 2);
             space.setValidCode((short) 2);
             spaceDao.save(space);
             spaceDao.save(space);
+
+            synSendMail(appeal.getContactEmail(), appeal.getType(), appeal.getContactName(), space.getSpaceName(), isPass);
         } else {
         } else {
             logger.info("暂无支持申诉类型");
             logger.info("暂无支持申诉类型");
         }
         }
     }
     }
 
 
+    private void synSendMail(String receipt, String appealType, String appealName, String spaceName, Boolean isPass) {
+        HashMap<String, String> params = new HashMap<>();
+        params.put("appealName", appealName);
+        String subject;
+        String templateName = isPass ? "appealPass" : "appealUnPass";
+
+        if (RESET_PASS.equals(appealType)) {
+            subject = "找回密码申诉";
+            params.put("appealMessage", "找回密码申诉");
+        } else if (VALID_MOBILE.equals(appealType)) {
+            subject = "绑定手机申诉";
+            params.put("appealMessage", "修改验证手机申诉");
+        } else if (CHANGE_ADMIN.equals(appealType)) {
+            subject = "更换管理员";
+            params.put("appealMessage", String.format("提交的%s更换管理员申诉", spaceName));
+        } else {
+            subject = "测试";
+            params.put("appealMessage", "测试");
+        }
+
+        ExecuteUtils.asyncExecute(new Runnable() {
+            @Override
+            public void run() {
+                mailService.sendTemplateMail(receipt, subject, params, templateName);
+            }
+        });
+    }
+
     @Override
     @Override
     public Long countUnHandleAppeals() {
     public Long countUnHandleAppeals() {
 
 

+ 107 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/MailServiceImpl.java

@@ -0,0 +1,107 @@
+package com.uas.sso.sso.backend.service.impl;
+
+import com.uas.sso.sso.backend.service.MailService;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import org.apache.log4j.Logger;
+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.MimeMessageHelper;
+import org.springframework.stereotype.Component;
+import org.springframework.util.Assert;
+import org.thymeleaf.TemplateEngine;
+import org.thymeleaf.context.Context;
+
+/**
+ * A implementations of MailService.
+ *
+ * @author huxz
+ */
+@Component
+public class MailServiceImpl implements MailService {
+
+    private final Logger logger = Logger.getLogger(MailServiceImpl.class);
+
+    @Value("${mail.fromMail}")
+    private String from;
+
+    private final JavaMailSender mailSender;
+
+    private final TemplateEngine templateEngine;
+
+    @Autowired
+    public MailServiceImpl(JavaMailSender mailSender, TemplateEngine templateEngine) {
+        this.mailSender = mailSender;
+        this.templateEngine = templateEngine;
+    }
+
+    @Override
+    public void sendSimpleMail(String to, String subject, String content) {
+        long currentTimeMillis = System.currentTimeMillis();
+        if (logger.isDebugEnabled()) {
+            logger.debug("Create simple email message");
+        }
+        SimpleMailMessage message = new SimpleMailMessage();
+        message.setFrom(from);
+        message.setTo(to);
+        message.setSubject("测试");
+        message.setSentDate(new Date(currentTimeMillis));
+        message.setText(content);
+
+        try {
+            mailSender.send(message);
+
+            logger.info("邮件发送成功");
+        } catch (MailException e) {
+            e.printStackTrace();
+            logger.warn("邮件发送失败");
+        }
+    }
+
+    @Override
+    public void sendHtmlMail(String to, String subject, String content) {
+        Date current = new Date(System.currentTimeMillis());
+        if (logger.isDebugEnabled()) {
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            logger.debug(String.format("Create html mail message on %s", format.format(current)));
+        }
+
+        MimeMessage message = mailSender.createMimeMessage();
+
+        try {
+            MimeMessageHelper helper = new MimeMessageHelper(message, true);
+            helper.setFrom(from);
+            helper.setTo(to);
+            helper.setSubject(subject);
+            helper.setSentDate(current);
+            helper.setValidateAddresses(true);
+            helper.setText(content, true);
+
+            mailSender.send(message);
+            logger.info("HTML邮件发送成功");
+        } catch (MessagingException e) {
+            logger.warn("发送HTML邮件时出现异常!", e);
+        }
+    }
+
+    @Override
+    public void sendTemplateMail(String to, String subject, Map<String, String> params, String templateName) {
+        try {
+            Assert.notEmpty(params, "邮件模板的参数不能为空");
+
+            Context context = new Context();
+            context.setVariables(params);
+            String emailContent = templateEngine.process(templateName, context);
+
+            sendHtmlMail(to, subject, emailContent);
+        } catch (Exception e) {
+            logger.warn("生成邮件模板失败", e);
+        }
+    }
+}

+ 7 - 0
sso-manage-console/src/main/resources/config/application-dev.properties

@@ -23,3 +23,10 @@ spring.jpa.hibernate.ddl-auto=update
 
 
 management.security.enabled=false
 management.security.enabled=false
 logging.level.com.uas.sso.sso.backend=debug
 logging.level.com.uas.sso.sso.backend=debug
+
+spring.mail.host=smtp.usoftchina.com
+spring.mail.username=sso@usoftchina.com
+spring.mail.password=QWE899GHJ
+spring.mail.default-encoding=UTF-8
+
+mail.fromMail=sso@usoftchina.com

+ 7 - 0
sso-manage-console/src/main/resources/config/application-prod.properties

@@ -23,3 +23,10 @@ spring.jpa.hibernate.ddl-auto=update
 
 
 management.security.enabled=false
 management.security.enabled=false
 logging.level.com.uas.sso.sso.backend=debug
 logging.level.com.uas.sso.sso.backend=debug
+
+spring.mail.host=smtp.usoftchina.com
+spring.mail.username=sso@usoftchina.com
+spring.mail.password=QWE899GHJ
+spring.mail.default-encoding=UTF-8
+
+mail.fromMail=sso@usoftchina.com

+ 7 - 0
sso-manage-console/src/main/resources/config/application-test.properties

@@ -23,3 +23,10 @@ spring.jpa.hibernate.ddl-auto=update
 
 
 management.security.enabled=false
 management.security.enabled=false
 logging.level.com.uas.sso.sso.backend=debug
 logging.level.com.uas.sso.sso.backend=debug
+
+spring.mail.host=smtp.usoftchina.com
+spring.mail.username=sso@usoftchina.com
+spring.mail.password=QWE899GHJ
+spring.mail.default-encoding=UTF-8
+
+mail.fromMail=sso@usoftchina.com

+ 30 - 0
sso-manage-console/src/main/resources/templates/appealPass.html

@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <style type="text/css">
+        .message {
+            margin: 10px;
+        }
+        .message-greetings {
+        }
+        .message-content {
+            text-indent: 25px;
+            font-family: Microsoft YaHei, Microsoft YaHei UI, sans-serif, Monaco, Menlo, Consolas, "Courier New", monospace;
+        }
+        .message-greetings span:first-child {
+            color: #FF0000;
+        }
+    </style>
+</head>
+<body>
+    <div class="message">
+        <div class="message-greetings">尊敬的<span th:text="${appealName}"></span></div>
+        <div class="message-content">
+            您好,您的<span th:text="${appealMessage}"></span>已经通过,您可以通过新手机号和密码进行登录。
+            如果您在使用过程中有任何疑问,可以联系我们的客服400-830-1818
+        </div>
+    </div>
+</body>
+</html>

+ 30 - 0
sso-manage-console/src/main/resources/templates/appealUnPass.html

@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <style type="text/css">
+        .message {
+            margin: 10px;
+        }
+        .message-greetings {
+        }
+        .message-content {
+            text-indent: 25px;
+            font-family: Microsoft YaHei, Microsoft YaHei UI, sans-serif, Monaco, Menlo, Consolas, "Courier New", monospace;
+        }
+        .message-greetings span:first-child {
+            color: #FF0000;
+        }
+    </style>
+</head>
+<body>
+    <div class="message">
+        <div class="message-greetings">尊敬的<span th:text="${appealName}"></span></div>
+        <div class="message-content">
+            您好,您的<span th:text="${appealMessage}"></span>未能通过。如果您在使用过程中有任何疑问,
+            可以联系我们的客服400-830-1818
+        </div>
+    </div>
+</body>
+</html>

+ 3 - 7
sso-manage-console/src/test/java/com/uas/sso/sso/backend/ManageConsoleApplicationTests.java

@@ -1,16 +1,12 @@
 package com.uas.sso.sso.backend;
 package com.uas.sso.sso.backend;
 
 
-import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runner.RunWith;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.context.junit4.SpringRunner;
 
 
 @RunWith(SpringRunner.class)
 @RunWith(SpringRunner.class)
-@SpringBootTest
-public class ManageConsoleApplicationTests {
-
-	@Test
-	public void contextLoads() {
-	}
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+public abstract class ManageConsoleApplicationTests {
 
 
 }
 }

+ 40 - 0
sso-manage-console/src/test/java/com/uas/sso/sso/backend/service/MailServiceTest.java

@@ -0,0 +1,40 @@
+package com.uas.sso.sso.backend.service;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+public class MailServiceTest {
+
+    @Autowired
+    private MailService mailService;
+
+    @Test
+    public void sendSimpleMail() {
+        mailService.sendSimpleMail("huxz@usoftchina.com", "测试", "邮件内容乱码了吗");
+    }
+
+    @Test
+    public void sendTemplateMail() {
+        Map<String, String> params = new HashMap<>();
+        params.put("appealName", "胡学志");
+        params.put("appealMessage", "找回密码申诉");
+
+        mailService.sendTemplateMail("huxz@usoftchina.com", "测试", params, "appealPass");
+    }
+
+    @Test
+    public void sendTemplateMailNoParams() {
+        Map<String, String> params = new HashMap<>();
+        params.put("appealMessage", "找回密码申诉");
+
+        mailService.sendTemplateMail("huxz@usoftchina.com", "测试", params, "appealPass");
+    }
+}

+ 34 - 0
sso-manage-console/src/test/resources/application-dev.properties

@@ -0,0 +1,34 @@
+app.datasource.url=jdbc:mysql://192.168.253.12:3306/sso?characterEncoding=utf-8&useSSL=false
+app.datasource.username=root
+app.datasource.password=select111***
+app.datasource.driverClassName=com.mysql.jdbc.Driver
+app.datasource.initialSize=1
+app.datasource.minIdle=1
+app.datasource.maxActive=20
+app.datasource.maxWait=60000
+app.datasource.timeBetweenEvictionRunsMillis=60000
+app.datasource.minEvictableIdleTimeMillis=300000
+app.datasource.validationQuery=SELECT 1 FROM DUAL
+app.datasource.testWhileIdle=true
+app.datasource.testOnBorrow=true
+app.datasource.testOnReturn=false
+app.datasource.poolPreparedStatements=true
+app.datasource.timeBetweenLogStatsMillis=60000
+app.datasource.maxPoolPreparedStatementPerConnectionSize=20
+app.datasource.filters=stat,slf4j
+app.datasource.connectionProperties=druid.stat.mergeSql=false;druid.stat.slowSqlMillis=5000
+
+spring.jpa.show-sql=true
+spring.jpa.hibernate.ddl-auto=update
+
+management.security.enabled=false
+logging.level.com.uas.sso.sso.backend=debug
+
+spring.thymeleaf.mode=LEGACYHTML5
+
+spring.mail.host=smtp.usoftchina.com
+spring.mail.username=sso@usoftchina.com
+spring.mail.password=QWE899GHJ
+spring.mail.default-encoding=UTF-8
+
+mail.fromMail=sso@usoftchina.com