定义构造及接口
public class CodeItem { private String _itemText; private Object _itemValue; public CodeItem(){ } public CodeItem(String itemText, Object itemValue){ _itemText = itemText; _itemValue = itemValue; } public String get_itemText() { return _itemText; } public void set_itemText(String _itemText) { this._itemText = _itemText; } public Object get_itemValue() { return _itemValue; } public void set_itemValue(Object _itemValue) { this._itemValue = _itemValue; }}public interface IConvertEnumToCodeItem { String getCodeName();}
规范化枚举定义
定义枚举蕴含name和value字段,实现枚举转换接口,返回代码项名称
public enum EnableOrDisable implements IConvertEnumToCodeItem { Enable(100, "启用"), Disabele(300, "禁用"); private int _value; private String _name; private EnableOrDisable(int value, String name) { set_value(value); set_name((name)); } public int get_value() { return _value; } public void set_value(int _value) { this._value = _value; } public String get_name() { return _name; } public void set_name(String _name) { this._name = _name; } @Override public String toString() { return _name; } @Override public String getCodeName() { return "启用禁用"; } }
扫描转换枚举类
扫描我的项目包下的所有实现IConvertEnumToCodeItem接口须要转化的枚举类,拿到所有枚举项,调用接口的getCodeName办法获取代码项名称,最初组成代码项
public class CodeItemUtil { private static HashMap<String,List<CodeItem>> codeDic = new HashMap<>(); public static void initCodeItem(Class runtimeClass){ List<Class> filterClassList = new ArrayList<>(); filterClassList.add(IConvertEnumToCodeItem.class); List<Class<?>> enumClassList = ScanUtil.getAllClassByPackageName(runtimeClass.getPackage(),filterClassList); try{ for (Class clazz:enumClassList) { if (clazz.isEnum()){ List<CodeItem> codeItemList = new ArrayList<>(); Object[] oo = clazz.getEnumConstants(); for (Object obj : oo) { String itemText = ""; Object itemValue = null; List<Field> fs = Arrays.asList(clazz.getDeclaredFields()); for (Field field:fs) { field.setAccessible(true); if(field.getName().equals("_name")){ itemText = ConvertOp.convert2String(field.get(obj)); }else if(field.getName().equals("_value")){ itemValue = field.get(obj); } } if(!StringUtil.isEmpty(itemText) && null!=itemValue){ CodeItem codeItem = new CodeItem(itemText,itemValue); codeItemList.add(codeItem); } } Method getCodeNameMethod = clazz.getDeclaredMethod("getCodeName"); String codeName = ConvertOp.convert2String(getCodeNameMethod.invoke(oo[0])); if(codeDic.containsKey(codeName)){ throw new Exception("存在同样的枚举代码项,名称:"+codeName); } codeDic.put(codeName,codeItemList); } } if(codeDic.keySet().size()>0){ System.out.println("扫描并初始化枚举代码项胜利,代码项数量:"+codeDic.keySet().size()+"个"); } }catch (Exception e){ e.printStackTrace(); } }
系统启动扫描
新建class实现ApplicationRunner重写run办法,通过Order注解确定执行程序
@Component@Order(value = 99)public class StartUpContext implements ApplicationRunner { @Autowired private ApplicationContext context; @Override public void run(ApplicationArguments args) throws Exception { Map<String, Object> annotatedBeans = context.getBeansWithAnnotation(SpringBootApplication.class); Class bootClass = annotatedBeans.values().toArray()[0].getClass(); CodeItemUtil.initCodeItem(bootClass); }}
理论利用
通用接口
@RestController@RequestMapping("/common/enumcode")public class EnumCodeController extends BaseController { @ResponseBody @PostMapping("/getCodeDetail") public Object getCodeDetail(@RequestBody Map<String, Object> params){ String codeName = ConvertOp.convert2String(params.get("codeName")); if(StringUtil.isEmpty(codeName)){ return Result.errorResult().add("msg","代码项名称不能为空"); } List<CodeItem> codeItemList = CodeItemUtil.getCodeList(codeName); if(null==codeItemList){ return Result.errorResult().add("msg","代码项不存在"); }else{ return Result.okResult().add("obj",codeItemList); } }}
页面调用
//获取代码项具体function bindEnumCode(codeName,callback) { var codeItemUrl = apiFrameUrl + "/common/enumcode/getCodeDetail"; var data = { "codeName": codeName } JsonAjax_Sync(JSON.stringify(data), codeItemUrl, function (result, status) { if (callback) { callback(result, status); } })}//获取代码项具体实例 var pageData = { moduleStatusList: [] } bindEnumCode("模块状态", function(result, status) { Vue.set(pageData, "moduleStatusList", result.data.obj); });
//列表渲染代码项Vue.prototype.getCodeText = function (page, codeName, codeValue) { var text = ""; if (!page[codeName]) { bindEnumCode(codeName, function (result, status) { page[codeName] = result.data.obj; }) } page[codeName].forEach(element => { if (element.itemValue == codeValue) { text = element.itemText } }); return text;}//列表渲染代码项实例<el-table-column prop="moduleStatus" align="center" header-align="center" label="模块状态" width="100"> <template slot-scope="scope"> <span v-text="getCodeText(this,'模块状态',scope.row.moduleStatus)"></span> </template></el-table-column>