前言
我们在原来是使用枚举的时候,前后约定一个固定编码状态,如果后续状态码发生改变,前后端都会去改动。我们在想是否能通过一种方式,就交由后端维护一条编码减少维护难度。
实践
我们主要是想通过一个接口的方式将所有我们需要告知前端枚举全部返回,这篇博客主要是通过这种方案将这种方式将这个数据能够简单返回。
1、这里先贴出需要返回对象
@Data
@AllArgsConstructor
public class EnumResponse {
/**
* 枚举id(可以使字符串类型,也有可能是数值类型)
*/
private Serializable enumId;
/**
* 枚举名
*/
private String enumName;
/**
* 枚举描述
*/
private String enumDescription;
}
2、定义一下需要返回给前端的枚举
@Getter
@AllArgsConstructor
public enum OrderTypeEnum {
/**
* 公司下单
*/
COMPANY(0, "公司下单"),
/**
* 个人下单
*/
PERSONAL(1, "个人下单"),
/**
* 未知错误
*/
UNKNOWN(Integer.MAX_VALUE, "-");
private final int code;
private final String value;
public static OrderTypeEnum of(int code) {
for (OrderTypeEnum value : values()) {
if (value.code == code) {
return value;
}
}
return UNKNOWN;
}
}
@Getter
@AllArgsConstructor
public enum OrderSateEnum {
/**
* 30 分钟未支付
*/
EXPIRE(-1, "过期"),
/**
* 完成下单
*/
UN_PAY(0, "已下单"),
/**
* 完成支付
*/
PAY_COMPLETE(1, "支付完成"),
/**
* 已经发货
*/
DELIVER(2, "已经发货"),
/**
* 未知错误
*/
UNKNOWN(Integer.MAX_VALUE, "-");
private final int code;
private final String value;
public static OrderSateEnum of(int code) {
for (OrderSateEnum value : values()) {
if (value.code == code) {
return value;
}
}
return UNKNOWN;
}
}
3、定义管理返回前端枚举类
public enum AdminEnum {
/**
* 订单状态
*/
ORDER_STATE {
@Override
public List<EnumResponse> toEnumResponse() {
return Arrays.stream(OrderSateEnum.values()).filter(sateEnum -> sateEnum != OrderSateEnum.UNKNOWN)
.map(sateEnum -> new EnumResponse(sateEnum.getCode(),sateEnum.name(),sateEnum.getValue()))
.collect(Collectors.toList());
}
},
/**
* 订单类型
*/
ORDER_TYPE {
@Override
public List<EnumResponse> toEnumResponse() {
return Arrays.stream(OrderTypeEnum.values()).filter(typeEnum -> typeEnum != OrderTypeEnum.UNKNOWN)
.map(typeEnum -> new EnumResponse(typeEnum.getCode(), typeEnum.name(), typeEnum.getValue()))
.collect(Collectors.toList());
}
};
public abstract List<EnumResponse> toEnumResponse();
}
4、定义返回前端接口
@GetMapping("/enums")
public Map<AdminEnum,List<EnumResponse>> listEnum(){
return Arrays.stream(AdminEnum.values()).collect(Collectors.toMap(item -> item, AdminEnum::toEnumResponse));
}
查看接口返回效果