SpringBoot 中,返回给 前端如 Vue、thymeleaf 、javascript 插件如 bootstrapTable时,将code码转换成文本显示

1、重要代码

1)Dict.java 字典注解

package com.xx.app.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 *  字典注解
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Dict {

    String dictCode();
}

2)DictAspect .java 字典切面类

package com.xxx.app.aspect;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.xxx.app.common.aspect.annotation.Dict;
import com.xxx.app.common.constant.Constant;
import com.xxx.app.common.utils.PageUtils;
import com.xxx.app.common.utils.oConvertUtils;
import com.xxx.app.modules.service.SysDictService;
import com.xxx.app.modules.vo.SysDictShowVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


@Aspect
@Component
@Slf4j
public class DictAspect {

    @Autowired
    public SysDictService sysDictService;

    @pointcut("execution( * com.xxx.app..*.*Controller.*(..))")
    public void excudeService() {
    }

    @Around("excudeService()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
       
        long time1=System.currentTimeMillis();
        Object result = pjp.proceed();
        long time2=System.currentTimeMillis();
        log.debug("获取JSON数据 耗时:"+(time2-time1)+"ms");
       
        long start=System.currentTimeMillis();
        this.parseDictText(result);
        long end=System.currentTimeMillis();
        log.debug("解析注入JSON数据  耗时"+(end-start)+"ms");
      
        return result;
    }


    private void parseDictText(Object result) {
        if (result instanceof PageUtils) {
            if (((PageUtils) result).getRows() instanceof List<?>) {
                List<JSONObject> items = new ArrayList<>();
                List rows=((List<?>) ((PageUtils) result).getRows());
                for (Object record : rows) {

                    // 将对象转成json字符串。
                    // 此处转换时,对日期格式转换问题,所以下面还要对日期格式进行额外处理             
                    String json =JSONUtil.toJsonStr(record);

                    // 将json字符串转换 json对象
                    JSONObject item = JSONUtil.parSEObj(json);

                    for (Field field : oConvertUtils.getAllFields(record)) {
                        if (field.getAnnotation(Dict.class) != null) {

                            String groupKey = field.getAnnotation(Dict.class).dictCode();
                            String value = String.valueOf(item.get(field.getName()));

                            String dictText ="";
                            if (StringUtils.isNotBlank(value)){
                                //翻译字典值对应的txt
                                dictText = translateDictValue(groupKey, value);
                                log.info(" 字典Val : "+ value+" , 翻译字典 :"+dictText);
                                item.set(field.getName() + Constant.DICT_TEXT_SUFFIX, dictText);
                            }
                        }

                        // 对日期格式特殊处理。 LocalDateTime 类型转换string格式化日期
                       if (field.getType().getName().equals("java.time.LocalDateTime")  &&item.get(field.getName())!=null){
                           String value = String.valueOf(item.get(field.getName()));
                           SimpleDateFormat aDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                           item.set(field.getName(), aDate.format(new Date(Long.parseLong(value))));
                       }
                        // 对日期格式特殊处理。 LocalDate 类型转换string格式化日期
                       if (field.getType().getName().equals("java.time.LocalDate")  &&item.get(field.getName())!=null){
                           String value = String.valueOf(item.get(field.getName()));
                           SimpleDateFormat aDate=new SimpleDateFormat("yyyy-MM-dd");
                           item.set(field.getName(), aDate.format(new Date(Long.parseLong(value))));
                       }
                    }
                    items.add(item);
                }
                ((PageUtils) result).setRows(items);
            }
        }
    }

    private String translateDictValue(String groupKey, String value) {
        if(oConvertUtils.isEmpty(value)) {
            return "";
        }
        String dictText="";
        
        /**
         * 重要说明:
         */   
         //---------------  结合自己的项目进行修改  ---------------------     
        // 此处是从缓存、配置文件、或者 数据库查询,通过 code码 得到对应的文本显示 dictText
        // 结合自己的项目进行修改
        List<SysDictShowVO> list=sysDictService.getListByKey(groupKey);
        for (SysDictShowVO vo :list){
            if(vo.getDictValue().equals(value)){
                dictText=vo.getDictName();
                break;
            }
        }
        //=================== 结合自己的项目进行修改 ==================

        return dictText;
    }
}

3)在实体类属性添加 @Dict

public class Companys implements Serializable {    

    /** 状态 */
    @Dict(dictCode = "compay_status")
    private Integer status;

    /** 领域 */
    @Dict(dictCode = "industry_field")
    private String industryField;

	//----------------------------------------------
	// getter/setter 省略
}

2、不重要的代码

下面是 伪代码

@Controller
@RequestMapping("/companys")
public class CompanysController {

	@ResponseBody
	@PostMapping("/Pagelist")
	public PageUtils Pagelist(@RequestParam Map<String, Object> params) {
	
		PageQuery pageQuery = new PageQuery(params);
		Page<Companys> pageData = new Page<>(pageQuery.getPage(),pageQuery.getLimit());
		
		List<Companys> companysList = companysService.Pagelist(pageData, pageQuery);
		PageUtils pageUtils = new PageUtils(companysList , pageData.getTotal());
		return pageUtils;
	}
}

PageUtils 类:

public class  PageUtils implements Serializable {
	private static final long serialVersionUID = 1L;
	private long total;
	private List<?> rows;

	public PageUtils(List<?> list, long total) {
		this.rows = list;
		this.total = total;
	}
	//----------------------------------------------
	// getter/setter 省略
}

public class Constant {
    /**字典翻译文本后缀*/
    public static final String DICT_TEXT_SUFFIX = "DictText";
}
package com.xxx.app.common.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IoUtils;
import org.springframework.beans.BeanUtils;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnkNownHostException;
import java.sql.Date;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


@Slf4j
public class oConvertUtils {	
	/**
	 * 获取类的所有属性包括父类
	 * 
	 * @param object
	 * @return
	 */
	public static Field[] getAllFields(Object object) {
		Class<?> clazz = object.getClass();
		List<Field> fieldList = new ArrayList<>();
		while (clazz != null) {
			fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
			clazz = clazz.getSuperclass();
		}
		Field[] fields = new Field[fieldList.size()];
		fieldList.toArray(fields);
		return fields;
	}
}

3、思路说明

实体类上加 上 @Dict ,参数 dictCode = "compay_status"
DictAspect 定义了对 controller 类中的 返回值类型是 PageUtils 进行拦截处理。
对 PageUtils, List 中各对象的每个属性进行遍历,标注有 @Dict属性
根据 其vaue值 和 dictCode 值,从缓存、配置文件数据库进行查询配置,并增加一个 item.set(field.getName() + "DictText", dictText) 参数项。
在处理过程中,对象 转 字符串,字符串转对象过程中,日期格式出现了问题,需要对日期格式进行特特殊处理。

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...