wangliang 1 week ago
commit
13afbe237b

+ 33 - 0
.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 418 - 0
pom.xml

@@ -0,0 +1,418 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.qmth.cet.plug</groupId>
+    <artifactId>cet-plug</artifactId>
+    <version>1.0.0</version>
+    <packaging>jar</packaging>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <qmth.boot.version>1.0.5</qmth.boot.version>
+        <java.version>1.8</java.version>
+        <swagger2.version>2.9.2</swagger2.version>
+        <fastjson.version>1.2.68</fastjson.version>
+        <fileupload.version>1.4</fileupload.version>
+        <guava.version>27.1-jre</guava.version>
+        <hutool.version>5.0.6</hutool.version>
+        <bcprov.version>1.52</bcprov.version>
+        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
+        <gson.version>2.8.6</gson.version>
+        <commons.version>3.10</commons.version>
+        <commons.codec.version>1.15</commons.codec.version>
+        <commons-io.version>2.6</commons-io.version>
+        <jackson.version>2.11.0</jackson.version>
+        <swagger2-bootstrap.version>1.9.6</swagger2-bootstrap.version>
+        <jetbrains.version>13.0</jetbrains.version>
+        <httpclient.version>4.5.12</httpclient.version>
+        <version-plugin.version>2.8.1</version-plugin.version>
+        <netty-all.version>4.1.49.Final</netty-all.version>
+        <commons-text.version>1.9</commons-text.version>
+        <junit.version>4.13</junit.version>
+        <zip4j.version>1.3.3</zip4j.version>
+        <aspectj.version>1.9.6</aspectj.version>
+        <nanoid.version>2.0.0</nanoid.version>
+        <commons-lang3.version>3.1</commons-lang3.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>com.qmth.cet.plug</groupId>
+                <artifactId>cet-plug</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>starter-api</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>core-uid</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>core-cache</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>core-concurrent</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>tools-device</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>core-logging</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>core-models</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>core-retrofit</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-swagger-ui</artifactId>
+                <version>${swagger2.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-swagger2</artifactId>
+                <version>${swagger2.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>${commons.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-codec</groupId>
+                <artifactId>commons-codec</artifactId>
+                <version>${commons.codec.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-text</artifactId>
+                <version>${commons-text.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.code.gson</groupId>
+                <artifactId>gson</artifactId>
+                <version>${gson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>${guava.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-fileupload</groupId>
+                <artifactId>commons-fileupload</artifactId>
+                <version>${fileupload.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-core</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-annotations</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-databind</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool.version}</version>
+            </dependency>
+            <!-- aes PKCS7 -->
+            <dependency>
+                <groupId>org.bouncycastle</groupId>
+                <artifactId>bcprov-jdk15on</artifactId>
+                <version>${bcprov.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jetbrains</groupId>
+                <artifactId>annotations</artifactId>
+                <version>${jetbrains.version}</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>commons-io</groupId>
+                <artifactId>commons-io</artifactId>
+                <version>${commons-io.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpclient</artifactId>
+                <version>${httpclient.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.netty</groupId>
+                <artifactId>netty-all</artifactId>
+                <version>${netty-all.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>junit</groupId>
+                <artifactId>junit</artifactId>
+                <version>${junit.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.aspectj</groupId>
+                <artifactId>aspectjweaver</artifactId>
+                <version>${aspectj.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.aventrix.jnanoid</groupId>
+                <artifactId>jnanoid</artifactId>
+                <version>${nanoid.version}</version>
+            </dependency>
+            <!--quartz-->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-quartz</artifactId>
+                <version>${spring-boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>${commons-lang3.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <!-- 默认依赖测试JAR -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <version>${spring-boot.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>starter-api</artifactId>
+<!--            <exclusions>-->
+<!--                <exclusion>-->
+<!--                    <artifactId>core-solar</artifactId>-->
+<!--                    <groupId>com.qmth.boot</groupId>-->
+<!--                </exclusion>-->
+<!--            </exclusions>-->
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.boot</groupId>-->
+<!--            <artifactId>spring-boot-starter-aop</artifactId>-->
+<!--            <version>${spring-boot.version}</version>-->
+<!--        </dependency>-->
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>core-uid</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>tools-device</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>core-logging</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>core-models</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>core-retrofit</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>core-cache</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-all</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-text</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.aventrix.jnanoid</groupId>
+            <artifactId>jnanoid</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <version>${spring-boot.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat.embed</groupId>
+            <artifactId>tomcat-embed-core</artifactId>
+            <version>9.0.64</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-tx</artifactId>
+            <version>5.2.12.RELEASE</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>versions-maven-plugin</artifactId>
+                <version>${version-plugin.version}</version>
+                <configuration>
+                    <generateBackupPoms>false</generateBackupPoms>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>3.2.0</version>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                    <useDefaultDelimiters>false</useDefaultDelimiters>
+                    <delimiters>
+                        <delimiter>$[*]</delimiter>
+                    </delimiters>
+                    <!-- 过滤后缀不需要转码的文件后缀名pdf -->
+                    <nonFilteredFileExtensions>
+                        <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
+                    </nonFilteredFileExtensions>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.6.2</version>
+                <configuration>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <version>1.4.12</version>
+                <configuration>
+                    <repository>registry.cn-shenzhen.aliyuncs.com/cet-plug</repository>
+                    <tag>${project.version}</tag>
+                    <contextDirectory>${project.baseDir}</contextDirectory>
+                    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
+                    <pullNewerImage>true</pullNewerImage>
+                    <buildArgs>
+                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 18 - 0
src/main/java/com/qmth/cet/plug/CetPlugApplication.java

@@ -0,0 +1,18 @@
+package com.qmth.cet.plug;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@SpringBootApplication(scanBasePackages = "com.qmth.*", exclude = {SecurityAutoConfiguration.class})
+@EnableTransactionManagement // spring开启事务支持
+@EnableAsync // 开启异步任务
+public class CetPlugApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(CetPlugApplication.class, args);
+    }
+
+}

+ 22 - 0
src/main/java/com/qmth/cet/plug/annotation/ApiJsonObject.java

@@ -0,0 +1,22 @@
+package com.qmth.cet.plug.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @Description: swagger2 map参数说明注解
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/4/23
+ */
+@Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ApiJsonObject {
+
+    ApiJsonProperty[] value(); //对象属性值
+
+    String name();  //对象名称
+}

+ 28 - 0
src/main/java/com/qmth/cet/plug/annotation/ApiJsonProperty.java

@@ -0,0 +1,28 @@
+package com.qmth.cet.plug.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @Description: swagger2 map参数说明属性注解
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/4/23
+ */
+@Target(ElementType.ANNOTATION_TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ApiJsonProperty {
+
+    String key();  //key
+
+    String example() default "";
+
+    String type() default "string";
+
+    String description() default "";
+
+    boolean required() default false;
+}

+ 46 - 0
src/main/java/com/qmth/cet/plug/api/CetPlugController.java

@@ -0,0 +1,46 @@
+package com.qmth.cet.plug.api;
+
+
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.cet.plug.contant.SystemConstant;
+import com.qmth.cet.plug.util.Result;
+import com.qmth.cet.plug.util.ResultUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+import java.util.Objects;
+
+/**
+ * <p>
+ * cet外挂接口 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2025-06-13
+ */
+@Api(tags = "cet外挂接口Controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_CET_PLUG)
+@Validated
+public class CetPlugController {
+    private final static Logger log = LoggerFactory.getLogger(CetPlugController.class);
+
+    @ApiOperation(value = "测试")
+    @RequestMapping(value = "/test", method = RequestMethod.GET)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回数据", response = Objects.class)})
+    @Aac(auth = false)
+    public Result test() throws IOException {
+        log.info("test is come in");
+        return ResultUtil.ok();
+    }
+}

+ 88 - 0
src/main/java/com/qmth/cet/plug/aspect/ApiCetPlugControllerAspect.java

@@ -0,0 +1,88 @@
+package com.qmth.cet.plug.aspect;
+
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.cet.plug.contant.SystemConstant;
+import com.qmth.cet.plug.util.JacksonUtil;
+import com.qmth.cet.plug.util.ResultUtil;
+import com.qmth.cet.plug.util.ServletUtil;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.BeanPropertyBindingResult;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * @Description: api aspect
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/5/12
+ */
+@Aspect
+@Component
+public class ApiCetPlugControllerAspect {
+    private final static Logger log = LoggerFactory.getLogger(ApiCetPlugControllerAspect.class);
+
+    /**
+     * api切入点
+     */
+    @Pointcut("execution(public * com.qmth.cet.plug.api.*.*(..))")
+    public void apiAspect() {
+    }
+
+    /**
+     * 后台环绕切入
+     *
+     * @param joinPoint
+     * @return
+     * @throws Throwable
+     */
+    @Around(value = "apiAspect()")
+    public Object aroundApiPoint(ProceedingJoinPoint joinPoint) throws Throwable {
+        long start = System.currentTimeMillis();
+        StringJoiner stringJoiner = new StringJoiner("");
+        try {
+            MethodSignature msig = (MethodSignature) joinPoint.getSignature();
+            String className = msig.getDeclaringTypeName();
+            String methodName = msig.getName();
+            Object[] args = joinPoint.getArgs();
+            String[] paramsName = msig.getParameterNames();
+            HttpServletRequest request = ServletUtil.getRequest();
+            stringJoiner.add("============请求地址============:").add(request.getServletPath()).add("\r\n");
+            stringJoiner.add("============类============:").add(className).add("\r\n");
+            stringJoiner.add("============方法============:").add(methodName).add("\r\n");
+            if (Objects.nonNull(args) && args.length > 0) {
+                for (int i = 0; i < args.length; i++) {
+                    if (Objects.nonNull(args[i]) && (args[i] instanceof HttpServletRequest || args[i] instanceof HttpServletResponse || args[i] instanceof CommonsMultipartFile || args[i] instanceof MultipartFile || args[i] instanceof BeanPropertyBindingResult)) {
+                        continue;
+                    } else {
+                        stringJoiner.add("参数key:").add(JacksonUtil.parseJson(paramsName[i])).add(",参数value:").add(JacksonUtil.parseJson(args[i])).add("\r\n");
+                    }
+                }
+            }
+            return joinPoint.proceed();
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            if (e instanceof ApiException) {
+                return ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                return ResultUtil.error(e.getMessage());
+            }
+        } finally {
+            long end = System.currentTimeMillis();
+            stringJoiner.add("============耗时============:").add((end - start) / 1000 + "").add("秒");
+            log.info("request:{}", stringJoiner.toString());
+        }
+    }
+}

+ 76 - 0
src/main/java/com/qmth/cet/plug/config/SwaggerConfig.java

@@ -0,0 +1,76 @@
+package com.qmth.cet.plug.config;
+
+import com.google.common.base.Predicates;
+import com.qmth.cet.plug.contant.SystemConstant;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Parameter;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: swagger配置类
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/9/21
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+
+    @Bean
+    public Docket createRestApi() {
+//        ParameterBuilder tokenPar = new ParameterBuilder();
+//        ParameterBuilder tokenPar1 = new ParameterBuilder();
+//        ParameterBuilder tokenPar2 = new ParameterBuilder();
+//        ParameterBuilder tokenPar3 = new ParameterBuilder();
+//        ParameterBuilder tokenPar4 = new ParameterBuilder();
+//        ParameterBuilder tokenPar5 = new ParameterBuilder();
+        List<Parameter> pars = new ArrayList<>();
+//        tokenPar.name(SystemConstant.HEADER_PLATFORM).description("平台").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+//        tokenPar1.name(SystemConstant.HEADER_DEVICE_ID).description("设备id").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+//        tokenPar2.name(SystemConstant.HEADER_AUTHORIZATION).description("鉴权token").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+//        tokenPar3.name(SystemConstant.HEADER_TIME).description("时间戳").modelRef(new ModelRef("long")).parameterType("header").required(false).build();
+//        tokenPar4.name(SystemConstant.MD5.toLowerCase()).description("md5").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+//        pars.add(tokenPar.build());
+//        pars.add(tokenPar1.build());
+//        pars.add(tokenPar2.build());
+//        pars.add(tokenPar3.build());
+//        pars.add(tokenPar4.build());
+//        pars.add(tokenPar5.build());
+
+        return new Docket(DocumentationType.SWAGGER_2)
+                .groupName("cet-plug")
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.qmth"))
+//                .apis(RequestHandlerSelectors.any())
+                .paths(PathSelectors.any())
+                // 不显示错误的接口地址
+                .paths(Predicates.not(PathSelectors.regex("/error.*")))// 错误路径不监控
+                .build()
+                .globalOperationParameters(pars)
+                .apiInfo(apiInfo());
+    }
+
+    private ApiInfo apiInfo() {
+        ApiInfo apiInfo = new ApiInfo(
+                "cet-外挂-api",
+                "Some custom description of API.",
+                "API TOS",
+                "Terms of service",
+                "myeaddress@company.com",
+                "License of API",
+                "API license URL");
+        return apiInfo;
+    }
+}

+ 69 - 0
src/main/java/com/qmth/cet/plug/contant/SpringContextHolder.java

@@ -0,0 +1,69 @@
+package com.qmth.cet.plug.contant;
+
+import com.qmth.cet.plug.enums.ExceptionResultEnum;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: spring上下文获取工具
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/10/11
+ */
+@Component
+public class SpringContextHolder implements ApplicationContextAware {
+    /**
+     * 上下文对象实例
+     */
+    private volatile static ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        SpringContextHolder.applicationContext = applicationContext;
+    }
+
+    /**
+     * 获取application上下文对象
+     *
+     * @return
+     */
+    public static ApplicationContext getApplicationContext() {
+        assertApplicationContext();
+        return applicationContext;
+    }
+
+    /**
+     * 通过name获取bean
+     *
+     * @param beanName
+     * @return
+     */
+//    @SuppressWarnings("unchecked")//忽略警告
+    public static <T> T getBean(String beanName) {
+        assertApplicationContext();
+        return (T) applicationContext.getBean(beanName);
+    }
+
+    /**
+     * 通过class获取bean
+     *
+     * @param requiredType
+     * @return
+     */
+    public static <T> T getBean(Class<T> requiredType) {
+        assertApplicationContext();
+        return (T) applicationContext.getBean(requiredType);
+    }
+
+    /**
+     * 获取实例
+     */
+    private static void assertApplicationContext() {
+        if (SpringContextHolder.applicationContext == null) {
+            throw ExceptionResultEnum.ERROR.exception("applicaitonContext属性为null,请检查是否注入了SpringContextHolder!");
+        }
+    }
+}

+ 36 - 0
src/main/java/com/qmth/cet/plug/contant/SystemConstant.java

@@ -0,0 +1,36 @@
+package com.qmth.cet.plug.contant;
+
+import com.aventrix.jnanoid.jnanoid.NanoIdUtils;
+
+/**
+ * @Description: 系统常量
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/10/11
+ */
+public class SystemConstant {
+
+    /**
+     * 系统常量
+     */
+    public static final String LOG_ERROR = "请求出错:{}";
+    public static final String PREFIX_URL_CET_PLUG = "/cet/plug";
+    public static final String UPDATE_TIME = "updateTime";
+    public static final String SUCCESS = "success";
+
+//    public static final String HEADER_AUTHORIZATION = "Authorization";
+//    public static final String HEADER_TIME = "time";
+//    public static final String HEADER_PLATFORM = "platform";
+//    public static final String HEADER_DEVICE_ID = "deviceId";
+//    public static final String MD5 = "MD5";
+
+    /**
+     * 获取nanoId
+     *
+     * @return
+     */
+    public static String getNanoId() {
+        return NanoIdUtils.randomNanoId();
+    }
+}

+ 71 - 0
src/main/java/com/qmth/cet/plug/enums/ExceptionResultEnum.java

@@ -0,0 +1,71 @@
+package com.qmth.cet.plug.enums;
+
+import com.qmth.boot.api.exception.ApiException;
+import org.springframework.http.HttpStatus;
+
+/**
+ * @Description: 自定义异常消息枚举
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/10/11
+ */
+public enum ExceptionResultEnum {
+    /**
+     * 系统预置
+     */
+    SUCCESS(HttpStatus.OK, 200, "成功"),
+
+    ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000001, "失败"),
+
+    PARAMS_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000002, "参数错误"),
+
+    SQL_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000003, "sql异常:"),
+
+    INVOCATIONTARGET_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000004, "反射异常:"),
+
+    SERVICE_NOT_FOUND(HttpStatus.INTERNAL_SERVER_ERROR, 5000005, "服务器错误"),
+
+    UNKONW_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000006, "未知错误:请联系管理员"),
+
+    EXCEPTION_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000007, "系统异常:请联系管理员"),
+
+    /**
+     * 404
+     */
+    NOT_FOUND(HttpStatus.NOT_FOUND, 4040003, "请求地址错误");
+
+    private HttpStatus status;
+    private int code;
+    private String message;
+
+    private ExceptionResultEnum(HttpStatus status, int code, String message) {
+        this.status = status;
+        this.code = code;
+        this.message = message;
+    }
+
+    public HttpStatus getStatus() {
+        return status;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public ApiException exception() {
+        return new ApiException(status, code, message, message);
+    }
+
+    public ApiException exception(int code, String message) {
+        return new ApiException(status, code, message, message);
+    }
+
+    public ApiException exception(String message) {
+        return new ApiException(status, code, message, message);
+    }
+}

+ 24 - 0
src/main/java/com/qmth/cet/plug/start/StartRunning.java

@@ -0,0 +1,24 @@
+package com.qmth.cet.plug.start;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 服务启动时初始化运行,哪个微服务模块需要则拿此模版去用
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/3
+ */
+@Component
+public class StartRunning implements CommandLineRunner {
+    private final static Logger log = LoggerFactory.getLogger(StartRunning.class);
+
+    @Override
+    public void run(String... args) throws Exception {
+        log.info("服务器启动时执行 start");
+        log.info("服务器启动时执行 end");
+    }
+}

+ 30 - 0
src/main/java/com/qmth/cet/plug/util/GsonUtil.java

@@ -0,0 +1,30 @@
+package com.qmth.cet.plug.util;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonParseException;
+
+import java.lang.reflect.Type;
+
+/**
+ * @Description: Json工具类
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/10/12
+ */
+public class GsonUtil {
+    private static Gson gson = new GsonBuilder().create();
+
+    public static String toJson(Object value) {
+        return gson.toJson(value);
+    }
+
+    public static <T> T fromJson(String json, Class<T> classOfT) throws JsonParseException {
+        return gson.fromJson(json, classOfT);
+    }
+
+    public static <T> T fromJson(String json, Type typeOfT) throws JsonParseException {
+        return (T) gson.fromJson(json, typeOfT);
+    }
+}

+ 108 - 0
src/main/java/com/qmth/cet/plug/util/JacksonUtil.java

@@ -0,0 +1,108 @@
+package com.qmth.cet.plug.util;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.qmth.cet.plug.contant.SystemConstant;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * @Description: jackson util
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/6
+ */
+public class JacksonUtil {
+    private final static Logger log = LoggerFactory.getLogger(JacksonUtil.class);
+    private volatile static ObjectMapper objectMapper = null;
+
+    static {
+        getInstance();
+    }
+
+    public static ObjectMapper getInstance() {
+        if (Objects.isNull(objectMapper)) {
+            synchronized (ObjectMapper.class) {
+                if (Objects.isNull(objectMapper)) {
+//                    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);//排除json字符串中实体类没有的字段
+                    objectMapper = new ObjectMapper();
+                }
+            }
+        }
+        return objectMapper;
+    }
+
+    /**
+     * 解析json
+     *
+     * @param o
+     * @return
+     */
+    public static String parseJson(Object o) {
+        try {
+            return objectMapper.writeValueAsString(o);
+        } catch (JsonProcessingException e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        }
+        return null;
+    }
+
+    /**
+     * 读取json
+     *
+     * @param o
+     * @param valueType
+     * @param <T>
+     * @return
+     */
+    public static <T> T readJson(String o, Class<T> valueType) {
+        try {
+            return objectMapper.readValue(o, valueType);
+        } catch (JsonProcessingException e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        }
+        return null;
+    }
+
+    /**
+     * 读取json list
+     *
+     * @param o
+     * @param cla
+     * @param <T>
+     * @return
+     */
+    public static <T> T readJsonList(String o, Class<T> cla) {
+        try {
+            JavaType javaType = objectMapper.getTypeFactory().constructCollectionType(List.class, cla);
+            return objectMapper.readValue(o, javaType);
+        } catch (JsonProcessingException e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        }
+        return null;
+    }
+
+    /**
+     * 读取json set
+     *
+     * @param o
+     * @param cla
+     * @param <T>
+     * @return
+     */
+    public static <T> T readJsonSet(String o, Class<T> cla) {
+        try {
+            JavaType javaType = objectMapper.getTypeFactory().constructCollectionType(Set.class, cla);
+            return objectMapper.readValue(o, javaType);
+        } catch (JsonProcessingException e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        }
+        return null;
+    }
+}

+ 70 - 0
src/main/java/com/qmth/cet/plug/util/Result.java

@@ -0,0 +1,70 @@
+package com.qmth.cet.plug.util;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 自定义处理消息
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/10/11
+ */
+//@JsonInclude(JsonInclude.Include.NON_NULL)
+public class Result implements Serializable {
+    private int code;
+    private String message;
+    private Object data;
+
+    public Result() {
+
+    }
+
+    public Result(int code) {
+        this.code = code;
+    }
+
+    public Result(String message) {
+        this.message = message;
+    }
+
+    public Result(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Result(int code, String message, Object data) {
+        this.code = code;
+        this.message = message;
+        this.data = data;
+    }
+
+    public Result(int code, Object data, String message) {
+        this.code = code;
+        this.data = data;
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(Object data) {
+        this.data = data;
+    }
+}

+ 111 - 0
src/main/java/com/qmth/cet/plug/util/ResultUtil.java

@@ -0,0 +1,111 @@
+package com.qmth.cet.plug.util;
+
+import cn.hutool.http.HttpStatus;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.cet.plug.contant.SystemConstant;
+import com.qmth.cet.plug.enums.ExceptionResultEnum;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Collections;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 自定义消息工具
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/10/11
+ */
+public class ResultUtil {
+    private final static Logger log = LoggerFactory.getLogger(ResultUtil.class);
+
+    public static Result success(Object object) {
+        return new Result(ExceptionResultEnum.SUCCESS.getStatus().value(), ExceptionResultEnum.SUCCESS.getMessage(), object);
+    }
+
+    public static Result success() {
+        return success(null);
+    }
+
+    public static Result error(int code, String message) {
+        return new Result(code, message);
+    }
+
+    public static Result error() {
+        try {
+            StringJoiner stringJoiner = new StringJoiner("");
+            HttpServletRequest request = ServletUtil.getRequest();
+            stringJoiner.add("[error path]:").add(request.getServletPath()).add("\r\n");
+            stringJoiner.add("[status]:").add(String.valueOf(ExceptionResultEnum.EXCEPTION_ERROR.getStatus().value())).add("\r\n");
+            stringJoiner.add("[code]:").add(String.valueOf(ExceptionResultEnum.EXCEPTION_ERROR.getCode())).add("\r\n");
+            stringJoiner.add("[message]:").add(ExceptionResultEnum.EXCEPTION_ERROR.getMessage());
+            log.error(SystemConstant.LOG_ERROR, stringJoiner.toString());
+        } catch (Exception e) {
+        }
+        throw ExceptionResultEnum.EXCEPTION_ERROR.exception();
+    }
+
+    public static Result error(ApiException e, String message) {
+        try {
+            StringJoiner stringJoiner = new StringJoiner("");
+            HttpServletRequest request = ServletUtil.getRequest();
+            stringJoiner.add("[error path]:").add(request.getServletPath()).add("\r\n");
+            stringJoiner.add("[status]:").add(String.valueOf(e.getStatus().value())).add("\r\n");
+            stringJoiner.add("[code]:").add(String.valueOf(e.getCode())).add("\r\n");
+            stringJoiner.add("[message]:").add(message);
+            log.error(SystemConstant.LOG_ERROR, stringJoiner.toString());
+        } catch (Exception e1) {
+        }
+        throw new ApiException(e.getStatus(), e.getCode(), message, message);
+    }
+
+    public static Result error(ExceptionResultEnum e, int code, String message) {
+        try {
+            StringJoiner stringJoiner = new StringJoiner("");
+            HttpServletRequest request = ServletUtil.getRequest();
+            stringJoiner.add("[error path]:").add(request.getServletPath()).add("\r\n");
+            stringJoiner.add("[status]:").add(String.valueOf(e.getStatus().value())).add("\r\n");
+            stringJoiner.add("[code]:").add(String.valueOf(code)).add("\r\n");
+            stringJoiner.add("[message]:").add(message);
+            log.error(SystemConstant.LOG_ERROR, stringJoiner.toString());
+        } catch (Exception e1) {
+        }
+        throw e.exception(code, message);
+    }
+
+    public static Result error(String message) {
+        try {
+            StringJoiner stringJoiner = new StringJoiner("");
+            HttpServletRequest request = ServletUtil.getRequest();
+            stringJoiner.add("[error path]:").add(request.getServletPath()).add("\r\n");
+            stringJoiner.add("[status]:").add(String.valueOf(ExceptionResultEnum.ERROR.getStatus().value())).add("\r\n");
+            stringJoiner.add("[code]:").add(String.valueOf(ExceptionResultEnum.ERROR.getCode())).add("\r\n");
+            stringJoiner.add("[message]:").add(message);
+            log.error(SystemConstant.LOG_ERROR, stringJoiner.toString());
+        } catch (Exception e) {
+        }
+        throw ExceptionResultEnum.ERROR.exception(message);
+    }
+
+    public static Result ok(String message) {
+        return new Result(ExceptionResultEnum.SUCCESS.getStatus().value(), message);
+    }
+
+    public static Result ok(Object data) {
+        return new Result(ExceptionResultEnum.SUCCESS.getStatus().value(), data, ExceptionResultEnum.SUCCESS.getMessage());
+    }
+
+    public static Result ok(boolean success) {
+        return new Result(ExceptionResultEnum.SUCCESS.getStatus().value(), Collections.singletonMap(SystemConstant.SUCCESS, success), ExceptionResultEnum.SUCCESS.getMessage());
+    }
+
+    public static Result ok(Object data, String message) {
+        return new Result(ExceptionResultEnum.SUCCESS.getStatus().value(), data, message);
+    }
+
+    public static Result ok() {
+        return new Result(HttpStatus.HTTP_OK, Collections.singletonMap(SystemConstant.UPDATE_TIME, System.currentTimeMillis()), ExceptionResultEnum.SUCCESS.getMessage());
+    }
+}

+ 69 - 0
src/main/java/com/qmth/cet/plug/util/ServletUtil.java

@@ -0,0 +1,69 @@
+package com.qmth.cet.plug.util;
+
+import com.alibaba.fastjson.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.IOException;
+
+/**
+ * @Description: http工具
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/4/10
+ */
+public class ServletUtil {
+    private final static Logger log = LoggerFactory.getLogger(ServletUtil.class);
+
+    /**
+     * 输出错误
+     *
+     * @param response
+     * @param code
+     * @param message
+     * @throws IOException
+     */
+    public static void responseError(ServletResponse response, int code, String message) throws IOException {
+        HttpServletResponse httpResponse = (HttpServletResponse) response;
+        Result result = ResultUtil.error(code, message);
+        String json = JSONObject.toJSONString(result);
+        httpResponse.getWriter().print(json);
+    }
+
+    /**
+     * 获取HttpServletRequest
+     *
+     * @return
+     */
+    public static HttpServletRequest getRequest() {
+        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        return servletRequestAttributes.getRequest();
+    }
+
+    /**
+     * 获取HttpServletResponse
+     *
+     * @return
+     */
+    public static HttpServletResponse getResponse() {
+        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        return servletRequestAttributes.getResponse();
+    }
+
+    /**
+     * 获取HttpServletRequest
+     *
+     * @return
+     */
+    public static HttpSession getSession() {
+        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        return servletRequestAttributes.getRequest().getSession();
+    }
+}

+ 32 - 0
src/main/resources/application.properties

@@ -0,0 +1,32 @@
+server.port=7222
+#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+server.tomcat.threads.max=250
+#tomcat\u6700\u5927\u8FDE\u63A5\u6570
+server.tomcat.max-connections=2500
+#tomcat\u7684URI\u7F16\u7801
+server.tomcat.uri-encoding=UTF-8
+
+#\u9879\u76EE\u540D\u79F0
+spring.application.name=cet-plug
+
+#com.qmth.api.uri-prefix=/aaa
+#\u7EDF\u8BA1\u9875\u9762\u914D\u7F6E
+com.qmth.api.metrics-endpoint=/metrics-count
+com.qmth.api.global-auth=true
+#com.qmth.api.global-strict=false
+#com.qmth.api.global-rate-limit=1/5s
+
+#token\u8D85\u65F6\u914D\u7F6E
+com.qmth.auth.time-max-ahead=1m
+com.qmth.auth.time-max-delay=5m
+
+#\u7F13\u5B58\u65F6\u95F4
+com.qmth.cache.expire-after-write=8h
+
+#\u65E5\u671F\u683C\u5F0F\u5316
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+#\u65E5\u5FD7\u914D\u7F6E
+com.qmth.logging.root-level=info
+com.qmth.logging.file-path=/Users/king/Downloads/cet-plug.log

+ 13 - 0
src/test/java/com/qmth/cet/plug/CetPlugApplicationTests.java

@@ -0,0 +1,13 @@
+package com.qmth.cet.plug;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class CetPlugApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}