24282 преди 2 години
родител
ревизия
bb0e0e5aea

+ 13 - 0
pom.xml

@@ -67,6 +67,19 @@
             <version>3.5.2</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.5.2</version>
+        </dependency>
+
+        <!-- myBatis-plus代码自动生成模板引擎 -->
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.3</version>
+        </dependency>
+
         <!-- hutool -->
         <dependency>
             <groupId>cn.hutool</groupId>

+ 32 - 0
src/main/java/com/fjhx/base/BaseEntity.java

@@ -0,0 +1,32 @@
+package com.fjhx.base;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+}

+ 58 - 0
src/main/java/com/fjhx/base/R.java

@@ -0,0 +1,58 @@
+package com.fjhx.base;
+
+import cn.hutool.http.HttpStatus;
+import lombok.Data;
+
+/**
+ * 统一返回结果的类
+ */
+@Data
+public class R {
+
+    // 是否成功
+    private Boolean success;
+
+    // 返回码
+    private Integer code;
+
+    // 返回消息
+    private String message;
+
+    // 返回数据
+    private Object data;
+
+    // 成功
+    public static R ok() {
+        R r = new R();
+        r.setSuccess(true);
+        r.setCode(HttpStatus.HTTP_OK);
+        r.setMessage("成功");
+        return r;
+    }
+
+    // 成功
+    public static R ok(Object obj) {
+        R r = ok();
+        r.data = obj;
+        return r;
+    }
+
+    // 失败
+    public static R error(String errorMsg) {
+        R r = new R();
+        r.setSuccess(false);
+        r.setCode(HttpStatus.HTTP_BAD_REQUEST);
+        r.setMessage(errorMsg);
+        return r;
+    }
+
+    // 失败
+    public static R error(Integer errorCode, String errorMsg) {
+        R r = new R();
+        r.setSuccess(false);
+        r.setCode(errorCode);
+        r.setMessage(errorMsg);
+        return r;
+    }
+
+}

+ 37 - 0
src/main/java/com/fjhx/config/code/CodeGeneration.java

@@ -0,0 +1,37 @@
+package com.fjhx.config.code;
+
+import com.baomidou.mybatisplus.generator.FastAutoGenerator;
+import com.fjhx.base.BaseEntity;
+
+public class CodeGeneration {
+
+    private static final String url = System.getProperty("user.dir") + "\\src\\main\\java\\";
+
+    public static void main(String[] args) {
+        FastAutoGenerator.create(
+                        "jdbc:mysql://36.134.91.96:17330/service_email?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8",
+                        "fjhx2012mysql",
+                        "3PN-Mzn#vnP&q6d"
+                )
+                .globalConfig(builder -> builder
+                        // 设置作者
+                        .author("zlj")
+                        // 指定输出目录
+                        .outputDir(url)
+                        // 禁止打开输出目录
+                        .disableOpenDir())
+                .packageConfig(builder -> {
+                    builder.parent("com.fjhx"); // 设置父包名
+                })
+                .strategyConfig(builder -> builder
+                        // 设置需要生成的表名
+                        .addInclude("sys_config")
+                        .entityBuilder()
+                        .disableSerialVersionUID()
+                        .superClass(BaseEntity.class)
+                        .enableLombok()
+                        .addIgnoreColumns("create_time", "update_time"))
+                .execute();
+    }
+
+}

+ 28 - 0
src/main/java/com/fjhx/config/exception/ServiceException.java

@@ -0,0 +1,28 @@
+package com.fjhx.config.exception;
+
+import cn.hutool.http.HttpStatus;
+import lombok.Getter;
+
+/**
+ * 自定义异常
+ */
+@Getter
+public class ServiceException extends RuntimeException {
+
+    private final Integer errorCode;
+
+    private final String errorMsg;
+
+    // 传入业务异常说明
+    public ServiceException(String errorMsg) {
+        this.errorCode = HttpStatus.HTTP_BAD_REQUEST;
+        this.errorMsg = errorMsg;
+    }
+
+    // 传入业务异常说明
+    public ServiceException(int errorCode, String errorMsg) {
+        this.errorCode = errorCode;
+        this.errorMsg = errorMsg;
+    }
+
+}

+ 73 - 0
src/main/java/com/fjhx/config/exception/UnifiedExceptionHandler.java

@@ -0,0 +1,73 @@
+package com.fjhx.config.exception;
+
+import cn.hutool.http.HttpStatus;
+import com.fjhx.base.R;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Objects;
+
+/**
+ * 异常拦截器
+ */
+@Slf4j
+@RestControllerAdvice
+public class UnifiedExceptionHandler {
+
+    @Autowired
+    private HttpServletRequest request;
+
+    /**
+     * 自定义业务异常
+     */
+    @ExceptionHandler(value = ServiceException.class)
+    public R handleServiceException(ServiceException e) {
+        return R.error(e.getErrorCode(), e.getErrorMsg());
+    }
+
+    /**
+     * 非法数据异常
+     */
+    @ExceptionHandler(value = IllegalArgumentException.class)
+    public R handleIllegalArgumentException(IllegalArgumentException e) {
+        return R.error(HttpStatus.HTTP_BAD_REQUEST, e.getMessage());
+    }
+
+    /**
+     * 请求参数异常
+     */
+    @ExceptionHandler(HttpMessageNotReadableException.class)
+    public R handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
+        log.error(request.getRequestURI(), e);
+
+        if (Objects.requireNonNull(e.getMessage()).contains("JSON parse error")) {
+            return R.error(HttpStatus.HTTP_UNSUPPORTED_TYPE, "参数格式错误");
+        }
+        return R.error(HttpStatus.HTTP_UNSUPPORTED_TYPE, "请使用JSON方式传参");
+    }
+
+    /**
+     * 请求方式异常
+     */
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    public R handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
+        String method = e.getMethod();
+        log.error("{} 不支持 {} 请求", request.getRequestURI(), method);
+        return R.error(HttpStatus.HTTP_BAD_METHOD, "此方法不支持" + method + "请求");
+    }
+
+    /**
+     * 其他未知异常
+     */
+    @ExceptionHandler(value = Exception.class)
+    public R handleException(Exception e) {
+        log.error(request.getRequestURI(), e);
+        return R.error(HttpStatus.HTTP_INTERNAL_ERROR, "系统出现未知异常,请联系管理员");
+    }
+
+}

+ 30 - 0
src/main/java/com/fjhx/config/http/EmailEngineUtil.java

@@ -0,0 +1,30 @@
+package com.fjhx.config.http;
+
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+@Component
+public class EmailEngineUtil {
+
+    private static String urlPrefix;
+
+    private static final RestTemplate restTemplate = new RestTemplate();
+
+    @Value("${config.urlPrefix}")
+    public void setUrlPrefix(String urlPrefix) {
+        EmailEngineUtil.urlPrefix = urlPrefix;
+    }
+
+    public static <T> T get(String url, Class<T> cls) {
+        String result = HttpUtil.get(urlPrefix + url);
+        return JSONObject.parseObject(result).toJavaObject(cls);
+    }
+
+    public static <T> T post(String url, Object paramObj, Class<T> cls) {
+        return restTemplate.postForObject(urlPrefix + url, paramObj, cls);
+    }
+
+}

+ 29 - 0
src/main/java/com/fjhx/controller/AccountController.java

@@ -0,0 +1,29 @@
+package com.fjhx.controller;
+
+import com.fjhx.base.R;
+import com.fjhx.service.IAccountService;
+import com.fjhx.vo.BindingVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/account")
+public class AccountController {
+
+    @Autowired
+    private IAccountService accountService;
+
+    /**
+     * 绑定邮箱
+     */
+    @PostMapping("/binding")
+    public R binding(@RequestBody BindingVo bindingVo) {
+        accountService.binding(bindingVo);
+        return R.ok();
+    }
+
+
+}

+ 10 - 0
src/main/java/com/fjhx/service/IAccountService.java

@@ -0,0 +1,10 @@
+package com.fjhx.service;
+
+import com.fjhx.vo.BindingVo;
+
+public interface IAccountService {
+
+    void binding(BindingVo bindingVo);
+
+
+}

+ 72 - 0
src/main/java/com/fjhx/service/impl/AccountServiceImpl.java

@@ -0,0 +1,72 @@
+package com.fjhx.service.impl;
+
+import cn.hutool.core.lang.Assert;
+import com.alibaba.fastjson.JSONObject;
+import com.fjhx.config.http.EmailEngineUtil;
+import com.fjhx.service.IAccountService;
+import com.fjhx.vo.BindingVo;
+import com.fjhx.vo.VerifyResult;
+import com.fjhx.vo.VerifyVo;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AccountServiceImpl implements IAccountService {
+
+    @Override
+    public void binding(BindingVo bindingVo) {
+        // 验证邮件配置参数
+        VerifyVo verifyVo = createVerifyVo(bindingVo);
+        // 验证邮件配置是否正确
+        VerifyResult verifyResult = EmailEngineUtil.post("v1/verifyAccount", verifyVo, VerifyResult.class);
+        // 解析验证结果
+        parsingVerifyResult(verifyResult);
+
+
+        System.err.println(JSONObject.toJSONString(verifyResult));
+    }
+
+    private VerifyVo createVerifyVo(BindingVo bindingVo) {
+        VerifyVo verifyVo = new VerifyVo();
+
+        VerifyVo.Auth auth = new VerifyVo.Auth();
+        auth.setUser(bindingVo.getEmail());
+        auth.setPass(bindingVo.getSecretKey());
+
+        VerifyVo.Tls tls = new VerifyVo.Tls();
+        tls.setRejectUnauthorized(true);
+        tls.setMinVersion("TLSv1.2");
+
+        VerifyVo.Imap imap = new VerifyVo.Imap();
+        imap.setAuth(auth);
+        imap.setPort(bindingVo.getImapPort());
+        imap.setHost(bindingVo.getImapHost());
+        imap.setTls(tls);
+        imap.setSecure(true);
+        verifyVo.setImap(imap);
+
+        VerifyVo.Smtp smtp = new VerifyVo.Smtp();
+        smtp.setAuth(auth);
+        smtp.setPort(bindingVo.getSmtpPort());
+        smtp.setHost(bindingVo.getSmtpHost());
+        smtp.setTls(tls);
+        smtp.setSecure(true);
+        verifyVo.setSmtp(smtp);
+
+        return verifyVo;
+    }
+
+    /**
+     * 解析验证结果
+     */
+    private void parsingVerifyResult(VerifyResult verifyResult) {
+        VerifyResult.Status imap = verifyResult.getImap();
+        VerifyResult.Status smtp = verifyResult.getSmtp();
+
+        Assert.notNull(imap, "imap解析结果为空");
+        Assert.notNull(smtp, "smtp解析结果为空");
+
+        Assert.isTrue(imap.getSuccess(), "imap解析失败:error:{} ;code:{};", imap.getError(), imap.getCode());
+        Assert.isTrue(smtp.getSuccess(), "smtp解析失败:error:{} ;code:{};", smtp.getError(), smtp.getCode());
+    }
+
+}

+ 26 - 0
src/main/java/com/fjhx/vo/BindingVo.java

@@ -0,0 +1,26 @@
+package com.fjhx.vo;
+
+import lombok.Data;
+
+@Data
+public class BindingVo {
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 密匙
+     */
+    private String secretKey;
+
+    private Integer imapPort;
+
+    private String imapHost;
+
+    private Integer smtpPort;
+
+    private String smtpHost;
+
+}

+ 22 - 0
src/main/java/com/fjhx/vo/VerifyResult.java

@@ -0,0 +1,22 @@
+package com.fjhx.vo;
+
+import lombok.Data;
+
+@Data
+public class VerifyResult {
+
+    private Status imap;
+
+    private Status smtp;
+
+    @Data
+    public static class Status {
+        private Boolean success;
+
+        private String error;
+
+        private String code;
+
+    }
+
+}

+ 42 - 0
src/main/java/com/fjhx/vo/VerifyVo.java

@@ -0,0 +1,42 @@
+package com.fjhx.vo;
+
+import lombok.Data;
+
+@Data
+public class VerifyVo {
+
+    private Imap imap;
+
+    private Smtp smtp;
+
+    @Data
+    public static class Auth {
+        private String user;
+        private String pass;
+    }
+
+    @Data
+    public static class Tls {
+        private Boolean rejectUnauthorized;
+        private String minVersion;
+    }
+
+    @Data
+    public static class Imap {
+        private Auth auth;
+        private Integer port;
+        private String host;
+        private Tls tls;
+        private Boolean secure;
+    }
+
+    @Data
+    public static class Smtp {
+        private Auth auth;
+        private Integer port;
+        private String host;
+        private Tls tls;
+        private Boolean secure;
+    }
+
+}

+ 7 - 3
src/main/resources/application-dev.yml

@@ -6,9 +6,9 @@ spring:
   datasource:
     druid:
       driver-class-name: com.mysql.cj.jdbc.Driver
-      url: jdbc:mysql://127.0.0.1:3306/fly_back?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-      username: root
-      password: root
+      url: jdbc:mysql://36.134.91.96:17330/service_email?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+      username: fjhx2012mysql
+      password: 3PN-Mzn#vnP&q6d
 
   redis:
     # 地址
@@ -23,3 +23,7 @@ spring:
 mybatis-plus:
   configuration:
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+
+config:
+  urlPrefix: "http://localhost:3000/"

+ 6 - 3
src/main/resources/application-pro.yml

@@ -6,9 +6,9 @@ spring:
   datasource:
     druid:
       driver-class-name: com.mysql.cj.jdbc.Driver
-      url: jdbc:mysql://127.0.0.1:3306/fly_back?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-      username: root
-      password: root
+      url: jdbc:mysql://36.134.91.96:17330/service_email?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+      username: fjhx2012mysql
+      password: 3PN-Mzn#vnP&q6d
 
   redis:
     # 地址
@@ -19,3 +19,6 @@ spring:
     password:
     # 数据库索引
     database: 0
+
+config:
+  urlPrefix: "http://localhost:3000/"