🐎 @I18nField 新增 condition 属性,用于控制是否进行国际化处理,减少无效解析,提升性能
This commit is contained in:
@@ -29,4 +29,10 @@ public @interface I18nField {
|
||||
@AliasFor("value")
|
||||
String code() default "";
|
||||
|
||||
/**
|
||||
* 是否进行国际化的条件判断语句(SpEL 表达式),默认未 “”,表示永远翻译
|
||||
* @return 返回 boolean 的 SpEL 表达式
|
||||
*/
|
||||
String condition() default "";
|
||||
|
||||
}
|
||||
|
||||
@@ -4,13 +4,15 @@ import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import cn.hutool.core.util.ReflectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.context.MessageSource;
|
||||
import org.springframework.context.NoSuchMessageException;
|
||||
import org.springframework.context.i18n.LocaleContextHolder;
|
||||
import org.springframework.core.MethodParameter;
|
||||
import org.springframework.expression.Expression;
|
||||
import org.springframework.expression.ExpressionParser;
|
||||
import org.springframework.expression.spel.standard.SpelExpressionParser;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.converter.HttpMessageConverter;
|
||||
import org.springframework.http.server.ServerHttpRequest;
|
||||
@@ -20,7 +22,9 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 利用 ResponseBodyAdvice 对返回结果进行国际化处理
|
||||
@@ -38,6 +42,16 @@ public class I18nResponseAdvice implements ResponseBodyAdvice<Object> {
|
||||
|
||||
private Locale fallbackLocale = null;
|
||||
|
||||
/**
|
||||
* SpEL 解析器
|
||||
*/
|
||||
private static final ExpressionParser PARSER = new SpelExpressionParser();
|
||||
|
||||
/**
|
||||
* 表达式缓存
|
||||
*/
|
||||
private static final Map<String, Expression> EXPRESSION_CACHE = new HashMap();
|
||||
|
||||
public I18nResponseAdvice(MessageSource messageSource, I18nOptions i18nOptions) {
|
||||
this.messageSource = messageSource;
|
||||
|
||||
@@ -99,6 +113,21 @@ public class I18nResponseAdvice implements ResponseBodyAdvice<Object> {
|
||||
if (i18nField == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 国际化条件判断
|
||||
String conditionExpression = i18nField.condition();
|
||||
if (StrUtil.isNotEmpty(conditionExpression)) {
|
||||
Expression expression = EXPRESSION_CACHE.get(conditionExpression);
|
||||
if (expression == null) {
|
||||
expression = PARSER.parseExpression(conditionExpression);
|
||||
EXPRESSION_CACHE.put(conditionExpression, expression);
|
||||
}
|
||||
Boolean needI18n = expression.getValue(source, Boolean.class);
|
||||
if (needI18n != null && !needI18n) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// 获取国际化的唯一标识
|
||||
String annotationCode = i18nField.code();
|
||||
String code = StrUtil.isNotEmpty(annotationCode) ? annotationCode : (String) fieldValue;
|
||||
|
||||
@@ -8,7 +8,6 @@ import org.springframework.expression.spel.standard.SpelExpressionParser;
|
||||
import org.springframework.expression.spel.support.StandardEvaluationContext;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
|
||||
@@ -9,8 +9,8 @@ import com.hccake.ballcat.common.model.result.R;
|
||||
import com.hccake.ballcat.common.security.constant.TokenAttributeNameConstants;
|
||||
import com.hccake.ballcat.common.security.userdetails.User;
|
||||
import com.hccake.ballcat.common.security.util.SecurityUtils;
|
||||
import com.hccake.ballcat.system.constant.SysPermissionConst;
|
||||
import com.hccake.ballcat.system.converter.SysMenuConverter;
|
||||
import com.hccake.ballcat.system.enums.SysMenuType;
|
||||
import com.hccake.ballcat.system.model.dto.SysMenuCreateDTO;
|
||||
import com.hccake.ballcat.system.model.dto.SysMenuUpdateDTO;
|
||||
import com.hccake.ballcat.system.model.entity.SysMenu;
|
||||
@@ -70,7 +70,7 @@ public class SysMenuController {
|
||||
|
||||
// 筛选出菜单
|
||||
List<SysMenuRouterVO> menuVOList = all.stream()
|
||||
.filter(menuVo -> SysPermissionConst.Type.BUTTON.getValue() != menuVo.getType())
|
||||
.filter(menuVo -> SysMenuType.BUTTON.getValue() != menuVo.getType())
|
||||
.sorted(Comparator.comparingInt(SysMenu::getSort)).map(SysMenuConverter.INSTANCE::poToRouterVo)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
package com.hccake.ballcat.system.constant;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @author Hccake
|
||||
* @version 1.0
|
||||
* @date 2019/10/12 19:01
|
||||
*/
|
||||
public final class SysPermissionConst {
|
||||
|
||||
private SysPermissionConst() {
|
||||
}
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum Type {
|
||||
|
||||
/**
|
||||
* 目录
|
||||
*/
|
||||
DIRECTORY(0),
|
||||
/**
|
||||
* 菜单
|
||||
*/
|
||||
MENU(1),
|
||||
/**
|
||||
* 按钮/权限
|
||||
*/
|
||||
BUTTON(2);
|
||||
|
||||
private final int value;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.hccake.ballcat.system.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 系统菜单类型
|
||||
* @author cheng
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum SysMenuType {
|
||||
|
||||
/**
|
||||
* 目录
|
||||
*/
|
||||
DIRECTORY(0),
|
||||
/**
|
||||
* 菜单
|
||||
*/
|
||||
MENU(1),
|
||||
/**
|
||||
* 按钮/权限
|
||||
*/
|
||||
BUTTON(2);
|
||||
|
||||
private final int value;
|
||||
|
||||
}
|
||||
@@ -6,8 +6,6 @@ import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 菜单权限授权对象
|
||||
*
|
||||
@@ -35,8 +33,14 @@ public class SysMenuGrantVO {
|
||||
/**
|
||||
* 菜单名称
|
||||
*/
|
||||
@I18nField
|
||||
@I18nField(condition = "type != 2")
|
||||
@ApiModelProperty(value = "菜单名称")
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 菜单类型 (0目录,1菜单,2按钮)
|
||||
*/
|
||||
@ApiModelProperty(value = "菜单类型 (0目录,1菜单,2按钮)")
|
||||
private Integer type;
|
||||
|
||||
}
|
||||
@@ -41,7 +41,7 @@ public class SysMenuPageVO {
|
||||
/**
|
||||
* 菜单名称
|
||||
*/
|
||||
@I18nField
|
||||
@I18nField(condition = "type != 2")
|
||||
@ApiModelProperty(value = "菜单名称")
|
||||
private String i18nTitle;
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ public class SysMenuRouterVO {
|
||||
/**
|
||||
* 菜单名称
|
||||
*/
|
||||
@I18nField
|
||||
@I18nField(condition = "type != 2")
|
||||
@ApiModelProperty(value = "菜单名称")
|
||||
private String title;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user