浏览代码

框架优化

24282 2 年之前
父节点
当前提交
fa18114329

+ 14 - 0
ruoyi-common/src/main/java/com/ruoyi/common/annotation/NonInterception.java

@@ -0,0 +1,14 @@
+package com.ruoyi.common.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * 排除接口返回统一格式
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+@Documented
+public @interface NonInterception {
+
+}

+ 1 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java

@@ -39,6 +39,7 @@ public class BaseEntity implements Serializable
     private Date updateTime;
 
     /** 备注 */
+    @TableField(exist = false)
     private String remark;
 
     /** 请求参数 */

+ 9 - 5
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java

@@ -1,14 +1,16 @@
 package com.ruoyi.common.core.domain.entity;
 
-import java.util.ArrayList;
-import java.util.List;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
 import javax.validation.constraints.Email;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import com.ruoyi.common.core.domain.BaseEntity;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 部门表 sys_dept
@@ -50,9 +52,11 @@ public class SysDept extends BaseEntity
     private String delFlag;
 
     /** 父部门名称 */
+    @TableField(exist = false)
     private String parentName;
     
     /** 子部门 */
+    @TableField(exist = false)
     private List<SysDept> children = new ArrayList<SysDept>();
 
     public Long getDeptId()

+ 54 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/PageWrapper.java

@@ -0,0 +1,54 @@
+package com.ruoyi.common.utils;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.convert.Convert;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+@SuppressWarnings("unused")
+public class PageWrapper<T> {
+
+    /**
+     * 页数
+     */
+    private final Integer pageNum;
+
+    /**
+     * 每页条数
+     */
+    private final Integer pageSize;
+
+    /**
+     * 总条数
+     */
+    private final Integer total;
+
+    /**
+     * 数据列表
+     */
+    private final List<T> rows;
+
+    /**
+     * 包装page成前端需要的格式
+     */
+    public PageWrapper(IPage<T> page) {
+        this.pageNum = Convert.toInt(page.getPages());
+        this.pageSize = Convert.toInt(page.getSize());
+        this.total = Convert.toInt(page.getTotal());
+        this.rows = page.getRecords();
+    }
+
+    /**
+     * 包装page成前端需要的格式,并把数据列表转成指定实体
+     */
+    public PageWrapper(IPage<?> page, Class<T> cls) {
+        this.pageNum = Convert.toInt(page.getPages());
+        this.pageSize = Convert.toInt(page.getSize());
+        this.total = Convert.toInt(page.getTotal());
+        this.rows = BeanUtil.copyToList(page.getRecords(), cls);
+    }
+
+}

+ 49 - 4
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java

@@ -1,26 +1,43 @@
 package com.ruoyi.framework.config;
 
-import java.util.concurrent.TimeUnit;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.utils.PageWrapper;
+import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.http.CacheControl;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.web.cors.CorsConfiguration;
 import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
 import org.springframework.web.filter.CorsFilter;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-import com.ruoyi.common.config.RuoYiConfig;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 通用配置
  * 
  * @author ruoyi
  */
+@EnableWebMvc
 @Configuration
+@SuppressWarnings({"unchecked", "rawtypes"})
 public class ResourcesConfig implements WebMvcConfigurer
 {
     @Autowired
@@ -70,4 +87,32 @@ public class ResourcesConfig implements WebMvcConfigurer
         // 返回新的CorsFilter
         return new CorsFilter(source);
     }
+
+    /**
+     * webMvc序列化
+     */
+    @Override
+    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+
+        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
+
+        ObjectMapper objectMapper = converter.getObjectMapper()
+                // 时间格式化
+                .setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"))
+                .registerModule(new SimpleModule()
+                        // 将Long转换成String
+                        .addSerializer(Long.class, ToStringSerializer.instance)
+                        // 将Page转成PageWrapper
+                        .addSerializer(IPage.class, new JsonSerializer<IPage>() {
+                            @Override
+                            public void serialize(IPage page, JsonGenerator jg, SerializerProvider sp) throws IOException {
+                                jg.writeObject(new PageWrapper(page));
+                            }
+                        })
+                );
+
+        converter.setObjectMapper(objectMapper);
+        converters.add(converter);
+    }
+
 }

+ 39 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResponseAdvice.java

@@ -0,0 +1,39 @@
+package com.ruoyi.framework.config;
+
+import com.ruoyi.common.annotation.NonInterception;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.page.TableDataInfo;
+import org.springframework.core.MethodParameter;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
+
+import java.lang.reflect.AnnotatedElement;
+
+/**
+ * 做统一格式返回
+ */
+@ControllerAdvice
+public class ResponseAdvice implements ResponseBodyAdvice<Object> {
+
+    @Override
+    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
+        AnnotatedElement annotatedElement = returnType.getAnnotatedElement();
+        NonInterception annotation = annotatedElement.getAnnotation(NonInterception.class);
+        return annotation == null;
+    }
+
+    @Override
+    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
+        // 提供一定的灵活度,如果body已经被包装了,就不进行包装
+        if (body instanceof R || body instanceof AjaxResult || body instanceof TableDataInfo) {
+            return body;
+        }
+        return R.ok(body);
+    }
+
+}