在项目中,为了项目高效性,在数据库中常常把一些状态属性设置为int类型。如性别男-0,女-1;如支付状态未支付-0,已支付-1,已退款-2等等。
然而在前端展示的时候,我们希望看到的是男女,支付状态的具体说明,便于我们直观了解,而不是01这些看不懂,不易理解的数字。
如何在前端展示的时候将这些数字进行转换成中文接收并显示。方法如何设计比较合理实用?下面介绍三个方法,个人觉得方法三适用性最好,最通用,代码最简洁。
方法一:
直接在前端js代码中,写一个if转换的方法,前端调用,代码简单就不多做介绍。
适用性:适用于那些需转换属性个数少,每个属性中的数字代号少的小项目。
方法二:
一般项目中会建一个枚举,便于我们区分属性数字代号的含义。此方法是在枚举中写一个转换方法,如转换订单状态
(1)在枚举中写一个根据code查找枚举的方法。
public static OrderStatusEnum getOrderStatusEnum (Integer code){
//遍历此枚举对象中的所以枚举
for(OrderStatusEnum orderStatusEnum : (OrderStatusEnum.values()){
if(orderStatusEnum.getCode().equals(code)){//如果传入的code与此枚举code相同,则返回此枚举
return orderStatusEnum;
}
}
return null;
}
(2)在实体类或DTO中,进行转换。
public OrderStatusEnum getOrderStatusEnum (){
return OrderStatusEnum.getOrderStatusEnum(orderStatus);//orderStatus为该类的一个属性
}
(3)前端展示${order.getOrderStatusEnum().getMessage()}
实用性:这样虽然解决了问题,但每多一项需要转换的属性就需要多写一次,例如订单状态和支付状态就要写2次,有点繁琐和重复。
方法三:
写一个公用的方法,返回值为泛型T。传入2个参数,一个参数为code,一个参数转换对象枚举的Class。
(1)建一个枚举的接口如CodeEnum,里面有getCode()的抽象方法。接下来每个枚举实现这个接口。
(2)写一个枚举的工具类EnumUtil,用于转换code为对应的value。
//根据code和枚举对象的Class返回对应的枚举
public static <T extends CodeEnum> T getByCode(Integer code, Class<T> enumClass) {
//遍历该枚举对象类型中的所有枚举
for(T each : enumClass.getEnumConstants()){
if(each.getCode().equals(code)){
return each;
}
}
return null;
}
(3)在实体类或DTO中,调用这个枚举转换工具类方法。
public OrderStatusEnum getOrderStatusEnum (){
return EnumUtil.getByCode(orderStatus, OrderStatusEnum.class);
}
ps:需要在方法上加上注解@JsonIgnore,不然类里会多出2个属性
(4)前端展示${order.getOrderStatusEnum().getMessage()}
适用性:通用,只需要写一次,每次转换调用这个枚举转换工具类即可。