Преглед изворни кода

Merge branch 'release/1.0.0'

tianyunperfect пре 5 година
родитељ
комит
54892d7023

+ 0 - 2
App/target/classes/application-dev.yml

@@ -1,2 +0,0 @@
-#server:
-#  port: 90

+ 7 - 1
App/pom.xml → app/pom.xml

@@ -9,7 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>App</artifactId>
+    <artifactId>app</artifactId>
 
     <build>
         <plugins>
@@ -44,6 +44,12 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-aop</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.alvin</groupId>
+            <artifactId>common</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 0 - 0
App/src/main/java/com/alvin/Application.java → app/src/main/java/com/alvin/Application.java


+ 55 - 0
app/src/main/java/com/alvin/aspect/LogAspect.java

@@ -0,0 +1,55 @@
+package com.alvin.aspect;
+
+import com.google.gson.Gson;
+import lombok.extern.slf4j.Slf4j;
+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.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 日志切片
+ *
+ * @author tianyunperfect
+ * Created on 2019/9/19
+ */
+@Component
+@Aspect
+@Slf4j
+public class LogAspect {
+
+    @Pointcut("execution(public * com.alvin.controller..*.*(..))")
+    public void webLog() {
+    }
+
+    @Around("webLog()")
+    public Object doBefore(ProceedingJoinPoint joinPoint) throws Throwable {
+        /*
+         * 执行方法之前
+         */
+        long start = System.currentTimeMillis();
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+        /*
+         * 执行方法
+         */
+        Object result = joinPoint.proceed();
+        /*
+         * 执行方法之后
+         */
+        StringBuilder sb = new StringBuilder();
+        String split = "; ";
+        sb.append("url=").append(request.getRequestURL()).append(split);
+        sb.append("method=").append(request.getMethod()).append(split);
+        sb.append("class_method=").append(joinPoint.getSignature().getDeclaringTypeName()).append(".").append(joinPoint.getSignature().getName()).append(split);
+        sb.append("args=").append(new Gson().toJson(joinPoint.getArgs())).append(split);
+        sb.append("consumer time(ms) = ").append(System.currentTimeMillis() - start);
+        log.info(sb.toString());
+
+        return result;
+    }
+}

+ 47 - 0
app/src/main/java/com/alvin/config/LongToStringJsonConfig.java

@@ -0,0 +1,47 @@
+package com.alvin.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+
+import java.util.List;
+
+/**
+ * 我们把long类型数据传到前端时,会丢失精度,这里加一个配置类即可将long转换为string
+ *
+ * @author tianyunperfect
+ * @date 2020/05/20
+ */
+@Configuration
+public class LongToStringJsonConfig extends WebMvcConfigurationSupport {
+
+    /**
+     * 这个必须有,否则不能访问静态文件
+     * @param configurer
+     */
+    @Override
+    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
+        configurer.enable();
+    }
+
+    /**
+     * 配置Long转string
+     * @param converters
+     */
+    @Override
+    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
+        ObjectMapper objectMapper = new ObjectMapper();
+        SimpleModule simpleModule = new SimpleModule();
+        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
+        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
+        objectMapper.registerModule(simpleModule);
+        jackson2HttpMessageConverter.setObjectMapper(objectMapper);
+        converters.add(jackson2HttpMessageConverter);
+    }
+}

+ 36 - 0
app/src/main/java/com/alvin/controller/AppController.java

@@ -0,0 +1,36 @@
+package com.alvin.controller;
+
+import com.alvin.common.entity.PageResult;
+import com.alvin.common.entity.Result;
+import com.alvin.entity.User;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Collections;
+
+@RestController
+@RequestMapping("/user")
+public class AppController {
+    /**
+     * 找到一个
+     *
+     * @return {@link Result<User>}
+     */
+    @GetMapping("/findOne")
+    public Result<User> findOne() {
+        User user = new User();
+        user.setName("小米");
+        user.setAge(18);
+        return Result.success(user);
+    }
+
+    @GetMapping("/queryPage")
+    public Result<PageResult<User>> queryPage() {
+        User user = new User();
+        user.setName("小米");
+        user.setAge(18);
+        PageResult<User> pageResult = new PageResult<>(1, 10, 100L, Collections.singletonList(user));
+        return Result.success(pageResult);
+    }
+}

+ 9 - 0
app/src/main/java/com/alvin/entity/User.java

@@ -0,0 +1,9 @@
+package com.alvin.entity;
+
+import lombok.Data;
+
+@Data
+public class User {
+    private String name;
+    private Integer age;
+}

+ 32 - 0
app/src/main/java/com/alvin/handle/ExceptionHandle.java

@@ -0,0 +1,32 @@
+package com.alvin.handle;
+
+import com.alvin.common.entity.Result;
+import com.alvin.common.entity.ResultCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * Class ExceptionHandle ...
+ *s
+ * @author tianyunperfect
+ * Created on 2019/9/19
+ */
+@ControllerAdvice
+@Slf4j
+public class ExceptionHandle {
+
+    /**
+     * 统一异常处理
+     * @param e
+     * @return
+     */
+    @ResponseBody
+    @ExceptionHandler
+    public Result exceptionHandle(Exception e) {
+        e.printStackTrace();
+        log.error("系统异常:{}", e.toString());
+        return Result.failure(ResultCode.UNKNOW.ordinal(), e.getMessage());
+    }
+}

+ 0 - 0
App/src/main/resources/application-dev.yml → app/src/main/resources/application-dev.yml


+ 0 - 0
App/src/main/resources/application-prod.yml → app/src/main/resources/application-prod.yml


+ 0 - 0
App/src/main/resources/application.yml → app/src/main/resources/application.yml


+ 82 - 0
app/src/main/resources/logback-spring.xml

@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+
+    <contextName>logback</contextName>
+    <property name="logback.logdir" value="./log/"/>
+    <property name="logback.appname" value="java"/>
+
+    <!--输出到控制台 ConsoleAppender-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!--展示格式 layout-->
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d [%thread] %-5level %logger{36} %line : %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
+        所以我们使用下面的策略,可以避免输出 Error 的日志-->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!--过滤 Error-->
+            <level>ERROR</level>
+            <!--匹配到就禁止-->
+            <onMatch>DENY</onMatch>
+            <!--没有匹配到就允许-->
+            <onMismatch>ACCEPT</onMismatch>
+        </filter>
+        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
+            如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
+            的日志改名为今天的日期。即,<File> 的日志都是当天的。
+        -->
+        <File>${logback.logdir}/info.${logback.appname}.log</File>
+        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
+            <FileNamePattern>${logback.logdir}/info.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
+            <!--只保留最近90天的日志-->
+            <maxHistory>90</maxHistory>
+            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
+            <!--<totalSizeCap>1GB</totalSizeCap>-->
+        </rollingPolicy>
+        <!--日志输出编码格式化-->
+        <encoder>
+            <charset>UTF-8</charset>
+            <pattern>%d [%thread] %-5level %logger{36} %line : %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>Error</level>
+        </filter>
+        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
+            如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
+            的日志改名为今天的日期。即,<File> 的日志都是当天的。
+        -->
+        <File>${logback.logdir}/error.${logback.appname}.log</File>
+        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
+            <FileNamePattern>${logback.logdir}/error.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
+            <!--只保留最近90天的日志-->
+            <maxHistory>90</maxHistory>
+            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
+            <!--<totalSizeCap>1GB</totalSizeCap>-->
+        </rollingPolicy>
+        <!--日志输出编码格式化-->
+        <encoder>
+            <charset>UTF-8</charset>
+            <pattern>%d [%thread] %-5level %logger{36} %line : %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!--指定最基础的日志输出级别-->
+    <root level="INFO">
+        <!--appender将会添加到这个loger-->
+        <appender-ref ref="console"/>
+        <appender-ref ref="fileInfoLog"/>
+        <appender-ref ref="fileErrorLog"/>
+    </root>
+
+</configuration>

+ 2 - 0
app/target/classes/application-dev.yml

@@ -0,0 +1,2 @@
+server:
+  port: 90

+ 2 - 0
app/target/classes/application-prod.yml

@@ -0,0 +1,2 @@
+server:
+  port: 90

+ 0 - 0
App/target/classes/application.yml → app/target/classes/application.yml


+ 82 - 0
app/target/classes/logback-spring.xml

@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+
+    <contextName>logback</contextName>
+    <property name="logback.logdir" value="./log/"/>
+    <property name="logback.appname" value="java"/>
+
+    <!--输出到控制台 ConsoleAppender-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!--展示格式 layout-->
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d [%thread] %-5level %logger{36} %line : %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
+        所以我们使用下面的策略,可以避免输出 Error 的日志-->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!--过滤 Error-->
+            <level>ERROR</level>
+            <!--匹配到就禁止-->
+            <onMatch>DENY</onMatch>
+            <!--没有匹配到就允许-->
+            <onMismatch>ACCEPT</onMismatch>
+        </filter>
+        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
+            如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
+            的日志改名为今天的日期。即,<File> 的日志都是当天的。
+        -->
+        <File>${logback.logdir}/info.${logback.appname}.log</File>
+        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
+            <FileNamePattern>${logback.logdir}/info.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
+            <!--只保留最近90天的日志-->
+            <maxHistory>90</maxHistory>
+            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
+            <!--<totalSizeCap>1GB</totalSizeCap>-->
+        </rollingPolicy>
+        <!--日志输出编码格式化-->
+        <encoder>
+            <charset>UTF-8</charset>
+            <pattern>%d [%thread] %-5level %logger{36} %line : %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>Error</level>
+        </filter>
+        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
+            如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
+            的日志改名为今天的日期。即,<File> 的日志都是当天的。
+        -->
+        <File>${logback.logdir}/error.${logback.appname}.log</File>
+        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
+            <FileNamePattern>${logback.logdir}/error.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
+            <!--只保留最近90天的日志-->
+            <maxHistory>90</maxHistory>
+            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
+            <!--<totalSizeCap>1GB</totalSizeCap>-->
+        </rollingPolicy>
+        <!--日志输出编码格式化-->
+        <encoder>
+            <charset>UTF-8</charset>
+            <pattern>%d [%thread] %-5level %logger{36} %line : %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!--指定最基础的日志输出级别-->
+    <root level="INFO">
+        <!--appender将会添加到这个loger-->
+        <appender-ref ref="console"/>
+        <appender-ref ref="fileInfoLog"/>
+        <appender-ref ref="fileErrorLog"/>
+    </root>
+
+</configuration>

+ 36 - 0
common/src/main/java/com/alvin/common/entity/PageResult.java

@@ -0,0 +1,36 @@
+package com.alvin.common.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 分页模板
+ *
+ * @author tianyunperfect
+ * @date 2020/05/20
+ */
+@Data
+@AllArgsConstructor
+public class PageResult<T> {
+    /**
+     * 第几页
+     *
+     * @mock 1
+     */
+    private Integer currentPage;
+    /**
+     * 每页数量
+     *
+     * @mock 10
+     */
+    private Integer pageSize;
+    /**
+     * 总数
+     *
+     * @mock @integer(9,99)
+     */
+    private Long total;
+    private List<T> list;
+}

+ 58 - 0
common/src/main/java/com/alvin/common/entity/Result.java

@@ -0,0 +1,58 @@
+package com.alvin.common.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+
+/**
+ * @Description
+ * @Author 田云
+ * @Date 2020/5/1 20:54
+ * @Version 1.0
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Result<T> implements Serializable {
+    private boolean success;
+    private Integer code;
+    private String message;
+    private T data;
+
+    public static <T> Result<T> result(Boolean flag, ResultCode resultCode, T data) {
+        return new Result<T>(flag, resultCode.ordinal(), resultCode.name(), data);
+    }
+
+    public static <T> Result<T> success(ResultCode resultCode, T data) {
+        return result(true, resultCode, data);
+    }
+
+    public static <T> Result<T> success(T data) {
+        return success(ResultCode.SUCCESS, data);
+    }
+
+    public static <T> Result<T> success() {
+        return success(null);
+    }
+
+    public static <T> Result<T> failure(Integer code, String message) {
+        return new Result<T>(false, code, message, null);
+    }
+
+    public static <T> Result<T> failure(ResultCode resultCode) {
+        return new Result<T>(false, resultCode.ordinal(), resultCode.name(), null);
+    }
+
+    public static <T> Result<T> failure() {
+        return failure(ResultCode.FAIL);
+    }
+
+    public static void main(String[] args) {
+        ArrayList<String> strings = new ArrayList<>();
+        strings.add("12");
+        System.out.println(Result.success(strings));
+    }
+}

+ 22 - 0
common/src/main/java/com/alvin/common/entity/ResultCode.java

@@ -0,0 +1,22 @@
+package com.alvin.common.entity;
+
+public enum ResultCode {
+    // 基本
+    SUCCESS(1, "success"),
+    FAIL(-1, "fail"),
+    UNKNOW(-2, "unknow"),
+    ;
+    /**
+     * 代码
+     */
+    private Integer code;
+    /**
+     * 消息
+     */
+    private String message;
+
+    ResultCode(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+}

+ 1 - 1
pom.xml

@@ -10,7 +10,7 @@
     <version>1.0-SNAPSHOT</version>
     <modules>
         <module>common</module>
-        <module>App</module>
+        <module>app</module>
     </modules>
 
     <parent>