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

Posted 猎人在吃肉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 中,返回给 前端如 Vuethymeleaf 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) 参数项。
在处理过程中,对象 转 字符串,字符串转对象过程中,日期格式出现了问题,需要对日期格式进行特特殊处理。

以上是关于SpringBoot 中,返回给 前端如 Vuethymeleaf javascript 插件如 bootstrapTable时,将code码转换成文本显示的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot返回正常时间给前端

SpringBoot返回正常时间给前端

springboot拦截器返回json数据给前端

【SpringBoot】2022-03-26【自定义请求转发、分发】

springboot后端的返回的data属性前端无法接收

Springboot Long类型数据太长返回给前端,精度丢失问题 复现解决