由于服务和业务拆分,在VUE前端有自定的标签:字典标签、用户标签、组织标签,通过先缓存加载所有数据后用自定义标签处理上述业务,但在做Android、IOS前端对接时,考虑到本地缓存因素,影响获取的数据可能不实时,而频繁调用接口,操作对接很麻烦,所以决定开发一套注解在后端进行翻译。
1、新增修改删除 数据库字典、用户、组织表的接口进行清除redis缓存数据
2、在需要的方法上添加自定义注解-->redis数据获取数据-->不同key切换数据 -->翻译
3、redis无数据-->查询数据-->加入缓存数据以map类型(key -value)存入
public enum FieldTypeEnum { /** * 系统全局数据库字典缓存 */ SYS_DICT("1"), /** * 系统全局用户库缓存 */ SYS_USER("2"), /** * 系统全局组织架构缓存 */ SYS_ORG("3"); private final String key; FieldTypeEnum(String key) { this.key = key; } public String getKey() { return key; } /** * 根据key动态获取对象 * * @param key * @return */ public static FieldTypeEnum getByKey(String key) { for (FieldTypeEnum type : FieldTypeEnum.values()) { if (String.valueOf(type.getKey()).equals(key)) { return type; } } return null; } }复制代码
public enum RedisKeyEnum { /** * 系统全局数据库字典缓存 */ SYS_DICT("redis_sys_dict_application"), /** * 系统全局用户库缓存 */ SYS_USER("redis_sys_user_application"), /** * 系统全局组织架构缓存 */ SYS_ORG("redis_sys_org_application"); private String value; RedisKeyEnum(String value) { this.value = value; } public String getValue() { return value; } }复制代码
@Target(value={ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SysField { /** * 需要被翻译的归属类型 * @return */ FieldTypeEnum type(); /** * 指定需要被翻译的字段 * @return */ String value(); /** * 指定翻译后的字段名 实体类必须定义此字段和getter.setter * @return */ String target(); /** * 字典编码 * @return */ String dictGroupCode() default "code"; } 复制代码
/** * * 系统翻译, * *注意:使用在需要将返回值翻译的方法上 * 将数据以key -value存入redis * 根据系统系统将key翻译成需要的value * 如果是数据库字典另外需要指定编码 * @author Administrator * */ @Retention(RetentionPolicy.RUNTIME) @Target(value={ElementType.METHOD}) @Documented public @interface TranslationSysFiled { SysField[] value(); }复制代码
@Aspect @Component public class TranslationSysFiledAspect { @Autowired private JedisUtil jedisUtil; @Autowired private SysUserService sysUserService; @Autowired private SysOrgService sysOrgService; @Autowired private SysDictService sysDictService; @Around("@annotation(translationSysFiled)") public Object Translation(ProceedingJoinPoint pjp, TranslationSysFiled translationSysFiled) throws Throwable{ Object result = this.doTranslation(pjp,translationSysFiled); return result; } private Object doTranslation(ProceedingJoinPoint pjp, TranslationSysFiled translationSysFiled) throws Throwable { Object result = pjp.proceed(); Class returnType = ((MethodSignature) pjp.getSignature()).getReturnType(); // 取出要翻译的值 String returnJsonResult = JSON.toJSONString(result, SerializerFeature.WriteMapNullValue); SysField[] sysFields = translationSysFiled.value(); for (SysField sysField : sysFields) { //获取注解上参数 FieldTypeEnum type = sysField.type(); String value = sysField.value(); String target = sysField.target(); String dictGroupCode = sysField.dictGroupCode(); //根据不同类型 变换 infoMap 值 Map<String, String> infoMap = this.changeInfoMap(type,dictGroupCode); Pattern pattern = Pattern.compile("/"" + value + ".*?,"); Matcher matcher = pattern.matcher(returnJsonResult); StringBuffer sb = new StringBuffer(); while (matcher.find()) { Pattern valuePattern = Pattern.compile(":/"(.*?)/","); Matcher valueMatcher = valuePattern.matcher(matcher.group().toString()); if (valueMatcher.find()) { // 翻译 String targetName = infoMap.get(valueMatcher.group(1)); String s = matcher.group() + "/"" + target + "/":/"" + targetName + "/","; matcher.appendReplacement(sb, s); } else { String s = matcher.group() + "/"" + target + "/":/"/","; matcher.appendReplacement(sb, s); } } matcher.appendTail(sb); String repaceStr = ",/"" + target + "/":null"; String repaceStr2 = ",/"" + target + "/":/"/""; returnJsonResult = sb.toString().replaceAll(repaceStr, "").replaceAll(repaceStr2, ""); } result = AspectUtils.getJsonToResultObject(returnJsonResult, returnType); return result; } private Map<String, String> changeInfoMap(FieldTypeEnum type, String dictGroupCode) { Map<String, String> infoMap = new HashMap<String, String>(); // 从redis获取缓存进行过滤 switch (type) { // FieldTypeEnum.getByKey(type) case SYS_DICT: // 数据库字典 FieldTypeEnum.SYS_DICT.getKey() infoMap = this.sysDictInfoMap(dictGroupCode); break; case SYS_USER: // 系统用户 FieldTypeEnum.SYS_USER.getKey() infoMap = this.sysUserInfoMap(); break; case SYS_ORG: // 系统组织 FieldTypeEnum.SYS_ORG.getKey() infoMap = this.sysOrgInfoMap(); break; default: break; } return infoMap; } /** * 系统组织 业务数据 * @return */ private Map<String, String> sysOrgInfoMap() { //1、从redis获取map Map<String, String> infoMap = jedisUtil.getMap(RedisKeyEnum.SYS_ORG.getValue()); if(ObjectUtils.isEmpty(infoMap)) { //2、1没有进行查询 infoMap = new HashMap<String, String>(); SysOrgParam params = new SysOrgParam(); List <SysOrgEntity> orgInfos = sysOrgService.queryAll(params); //2、2将查询的数据已key -value 存储到redis for (SysOrgEntity orgInfo : orgInfos) { infoMap.put(orgInfo.getOrgNo(), orgInfo.getOrgName()); } //jedisUtil.set(RedisKeyEnum.SYS_ORG.getValue(),JSON.toJSONString(infoMap,true)); jedisUtil.setMap(RedisKeyEnum.SYS_ORG.getValue(), infoMap,3000); return infoMap; }else { return infoMap; } } /** * 系统用户 业务数据 * @return */ private Map<String, String> sysUserInfoMap() { // 1、从redis获取map Map<String, String> infoMap = jedisUtil.getMap(RedisKeyEnum.SYS_USER.getValue()); if (ObjectUtils.isEmpty(infoMap)) { // 2、1没有进行查询 infoMap = new HashMap<String, String>(); Map<String, Object> params = new HashMap<String, Object>(); List <SysUserEntity> userInfos = sysUserService.queryAll(params); // 2、2将查询的数据已key -value 存储到redis for (SysUserEntity userInfo : userInfos) { infoMap.put(userInfo.getUserId(), userInfo.getRealName()); } //jedisUtil.set(RedisKeyEnum.SYS_USER.getValue(), JSON.toJSONString(infoMap, true)); jedisUtil.setMap(RedisKeyEnum.SYS_USER.getValue(), infoMap,3000); return infoMap; } else { return infoMap; } } /** * 数据库字典 业务数据 * @param dictGroupCode * @return */ private Map<String, String> sysDictInfoMap(String dictGroupCode) { // 1、从redis获取map String redis_dictInfos = jedisUtil.get(RedisKeyEnum.SYS_DICT.getValue()); List<SysDictEntity> dictInfos = new ArrayList<SysDictEntity>(); if(StringUtils.isNotBlank(redis_dictInfos)) { dictInfos = JSON.parseArray(redis_dictInfos, SysDictEntity.class); }else { // 2、1没有进行查询 dictInfos = sysDictService.queryAll(new SysDictParam()); // 2、2将查询的数据已key -value 存储到redis jedisUtil.set(RedisKeyEnum.SYS_DICT.getValue(),JSON.toJSONString(dictInfos,true)); } //将dictInfos进行过滤 List<SysDictEntity> collect = dictInfos.stream().filter(item-> item.getCode().equals(dictGroupCode)).collect(Collectors.toList()); // 先把字典值转成map Map<String, String> dictInfoMap = new HashMap<String, String>(); for (SysDictEntity dictInfo : collect) { dictInfoMap.put(dictInfo.getValue(), dictInfo.getName()); } return dictInfoMap; } }复制代码
XXX.Controller
@GetMapping("/info/{id}") @ApiOperation(value = "根据主键查询详情",responseContainer = "data",response = IwmEnergyIsolationEntity.class) @TranslationSysFiled({ @SysField(value = "licenseStatus",target = "licenseStatusName",type = Constant.FieldTypeEnum.SYS_DICT,dictGroupCode = "LICENSE_STATUS"), @SysField(value = "applicantUnitOrgNo",target = "applicantUnitOrgNoName",type = Constant.FieldTypeEnum.SYS_ORG), @SysField(value = "startUser",target = "startUserName",type = Constant.FieldTypeEnum.SYS_USER), @SysField(value = "isolationType",target = "isolationTypeName",type = Constant.FieldTypeEnum.SYS_DICT,dictGroupCode = "ISOLATION_TYPE"), @SysField(value = "isolationLevel",target = "isolationLevelName",type = Constant.FieldTypeEnum.SYS_DICT,dictGroupCode = "ISOLATION_LEVEL"), }) public RestResponse info(@PathVariable("id") String id) { IwmEnergyIsolationEntity iwmEnergyIsolation = iwmEnergyIsolationService.queryById(id); return RestResponse.success().put("isolation", iwmEnergyIsolation); }复制代码
IwmEnergyIsolationEntity.java
@Data @Accessors(chain = true) public class IwmEnergyIsolationEntity implements Serializable { //licenseStatus //applicantUnitOrgNo //startUser //isolationType //isolationLevel //省略。。。。 //用于翻译字段 @TableField(exist = false) private String licenseStatusName; @TableField(exist = false) private String applicantUnitOrgNoName; @TableField(exist = false) private String startUserName; @TableField(exist = false) private String isolationTypeName; @TableField(exist = false) private String isolationLevelName; }复制代码
blog.csdn.net/HuanFengZhi…