字段是怎么翻译的 jeecgboot改造:枚举加入字典,控制器返回列表翻译字典

版本:2.4.5虽然jeecg提供了数据字典功能,使用很方便,但在实际业务中,有根据不同值编写不同代码进行操作的需求,如果将这些代码写进数据字典中,那么字典值一旦被人修改

版本:2.4.5

虽然jeecg提供了数据字典功能,使用很方便,但在实际业务中,有根据不同值编写不同代码进行操作的需求,如果将这些代码写进数据字典中,那么字典值一旦被人修改,就会使代码运行不正常。使用枚举,就是为了避免此类问题,经尝试,改了些代码后,将枚举项的使用与数据字典一致化,使用起来会方便些。

枚举加入字典的方法

修改 .

  1. @Override
  2. public List<DictModel> getDictItems(String dictCode) {
  3. List<DictModel> ls;
  4. if (dictCode.contains(",")) {
  5. //关联表字典(举例:sys_user,realname,id
  6. String[] params = dictCode.split(",");
  7. if (params.length < 3) {
  8. // 字典Code格式不正确
  9. return null;
  10. }
  11. //SQL注入校验(只限制非法串改数据库)
  12. final String[] sqlInjCheck = {params[0], params[1], params[2]};
  13. SqlInjectionUtil.filterContent(sqlInjCheck);
  14. if (params.length == 4) {
  15. // SQL注入校验(查询条件SQL 特殊check,此方法仅供此处使用)
  16. SqlInjectionUtil.specialFilterContent(params[3]);
  17. ls = this.queryTableDictItemsByCodeAndFilter(params[0], params[1], params[2], params[3]);
  18. } else if (params.length == 3) {
  19. ls = this.queryTableDictItemsByCode(params[0], params[1], params[2]);
  20. } else {
  21. // 字典Code格式不正确
  22. return null;
  23. }
  24. } else {
  25. if (dictCode.indexOf(":") != -1) {
  26. //从枚举获取
  27. //格式 enum:DynamicDataTypeEnum
  28. String[] split = dictCode.split(":");
  29. String enumType = split[1];
  30. String className = DictEnumCache.getClassName(enumType);
  31. List<DictModel> list = new LinkedList();
  32. try {
  33. Class<?> aClass = Class.forName(className);
  34. Method toList = aClass.getDeclaredMethod("toList");
  35. Object[] oo = aClass.getEnumConstants();
  36. List<Map<String, Object>> invoke = (List<Map<String, Object>>) toList.invoke(oo[0]);
  37. invoke.forEach(f -> {
  38. DictModel dictModel = new DictModel();
  39. dictModel.setText(f.get("name").toString());
  40. dictModel.setValue(f.get("code").toString());
  41. list.add(dictModel);
  42. });
  43. } catch (Exception ex) {
  44. log.error("获取枚举项出错:{}",ex.getMessage());
  45. }
  46. ls = list;
  47. } else {
  48. //字典表
  49. ls = this.queryDictItemsByCode(dictCode);
  50. }
  51. }
  52. return ls;
  53. }

完成后可以使用 /sys/dict//enum: 获取枚举值项

修改 加入方法

  1. /**
  2. * 从枚举型中取字典
  3. * @param code
  4. * @param key
  5. * @return
  6. */
  7. String translateDictFromEnum(String code,String key);

修改 实现上述方法

  1. @Override
  2. public String translateDictFromEnum(String code, String key){
  3. //格式 enum:DynamicDataTypeEnum
  4. String[] split = code.split(":");
  5. String enumType = split[1];
  6. String className = DictEnumCache.getClassName(enumType);
  7. List<DictModel> list = new LinkedList();
  8. try {
  9. Class<?> aClass = Class.forName(className);
  10. Method toList = aClass.getDeclaredMethod("toList");
  11. Object[] oo = aClass.getEnumConstants();
  12. List<Map<String, Object>> invoke = (List<Map<String, Object>>) toList.invoke(oo[0]);
  13. Map<String, Object> code1 = invoke.stream().filter(f -> f.get("code").toString().equals(key)).findFirst().orElse(null);
  14. if(code1!=null){
  15. return code1.get("name").toString();
  16. }
  17. } catch (Exception ex) {
  18. log.error("获取枚举项出错:{}",ex.getMessage());
  19. }
  20. return null;
  21. }

字段是怎么翻译的 jeecgboot改造:枚举加入字典,控制器返回列表翻译字典

修改 . 方法,原方法只 对 Ipage 中的项翻译字典,修改后可对 List 页进行翻译

  1. private void parseDictText(Object result) {
  2. if (result instanceof Result) {
  3. List<Object> list = new LinkedList();
  4. if (((Result) result).getResult() instanceof IPage) {
  5. list = ((IPage) ((Result) result).getResult()).getRecords();
  6. } else if (((Result) result).getResult() instanceof List) {
  7. List<Object> tmplist = (List<Object>) ((Result) result).getResult();
  8. if (tmplist.size() > 0) {
  9. //判断能否转换成json
  10. try {
  11. String s = new ObjectMapper().writeValueAsString(tmplist.get(0));
  12. if(s.startsWith("{")) {
  13. list = (List<Object>) ((Result) result).getResult();
  14. }
  15. } catch (Exception e) {
  16. }
  17. }
  18. }
  19. if (list.size() > 0) {
  20. List<JSONObject> items = new ArrayList<>();
  21. for (Object record : list) {
  22. ObjectMapper mapper = new ObjectMapper();
  23. String json = "{}";
  24. try {
  25. //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat
  26. json = mapper.writeValueAsString(record);
  27. } catch (JsonProcessingException e) {
  28. log.error("json解析失败" + e.getMessage(), e);
  29. }
  30. JSONObject item = JSONObject.parseObject(json);
  31. //update-begin--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------
  32. //for (Field field : record.getClass().getDeclaredFields()) {
  33. for (Field field : oConvertUtils.getAllFields(record)) {
  34. //update-end--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------
  35. if (field.getAnnotation(Dict.class) != null) {
  36. String code = field.getAnnotation(Dict.class).dicCode();
  37. String text = field.getAnnotation(Dict.class).dicText();
  38. String table = field.getAnnotation(Dict.class).dictTable();
  39. String key = String.valueOf(item.get(field.getName()));
  40. //翻译字典值对应的txt
  41. String textValue = translateDictValue(code, text, table, key);
  42. log.debug(" 字典Val : " + textValue);
  43. log.debug(" __翻译字典字段__ " + field.getName() + CommonConstant.DICT_TEXT_SUFFIX + ": " + textValue);
  44. item.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue);
  45. }
  46. //date类型默认转换string格式化日期
  47. if (field.getType().getName().equals("java.util.Date") && field.getAnnotation(JsonFormat.class) == null && item.get(field.getName()) != null) {
  48. SimpleDateFormat aDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  49. item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName()))));
  50. }
  51. }
  52. items.add(item);
  53. }
  54. if (((Result) result).getResult() instanceof IPage) {
  55. ((IPage) ((Result) result).getResult()).setRecords(items);
  56. } else if (((Result) result).getResult() instanceof List) {
  57. ((Result) result).setResult(items);
  58. }
  59. }
  60. }
  61. }

修改 .方法 ,使其可对枚举型进行翻译

  1. private String translateDictValue(String code, String text, String table, String key) {
  2. if(oConvertUtils.isEmpty(key)) {
  3. return null;
  4. }
  5. StringBuffer textValue=new StringBuffer();
  6. String[] keys = key.split(",");
  7. for (String k : keys) {
  8. String tmpValue = null;
  9. log.debug(" 字典 key : "+ k);
  10. if (k.trim().length() == 0) {
  11. continue; //跳过循环
  12. }
  13. //update-begin--Author:scott -- Date:20210531 ----for !56 优化微服务应用下存在表字段需要字典翻译时加载缓慢问题-----
  14. if (!StringUtils.isEmpty(table)){
  15. log.info("--DictAspect------dicTable="+ table+" ,dicText= "+text+" ,dicCode="+code);
  16. String keyString = String.format("sys:cache:dictTable::SimpleKey [%s,%s,%s,%s]",table,text,code,k.trim());
  17. if (redisTemplate.hasKey(keyString)){
  18. try {
  19. tmpValue = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString));
  20. } catch (Exception e) {
  21. log.warn(e.getMessage());
  22. }
  23. }else {
  24. tmpValue= commonAPI.translateDictFromTable(table,text,code,k.trim());
  25. }
  26. }else if(code.indexOf(":")!=-1){
  27. //从枚举中获取字典值
  28. tmpValue = commonAPI.translateDictFromEnum(code,k.trim());
  29. }
  30. else{
  31. String keyString = String.format("sys:cache:dict::%s:%s",code,k.trim());
  32. if (redisTemplate.hasKey(keyString)){
  33. try {
  34. tmpValue = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString));
  35. } catch (Exception e) {
  36. log.warn(e.getMessage());
  37. }
  38. }else {
  39. tmpValue = commonAPI.translateDict(code, k.trim());
  40. }
  41. }
  42. //update-end--Author:scott -- Date:20210531 ----for !56 优化微服务应用下存在表字段需要字典翻译时加载缓慢问题-----
  43. if (tmpValue != null) {
  44. if (!"".equals(textValue.toString())) {
  45. textValue.append(",");
  46. }
  47. textValue.append(tmpValue);
  48. }
  49. }
  50. return textValue.toString();
  51. }

后端字段定义:

  1. @Dict(dicCode = "enum:FieldTypeEnum")
  2. private java.lang.String itemType;

前端form中使用控件:

  1. <j-dict-select-tag v-model="model.itemType" placeholder="请选择类型" dictCode="enum:FieldTypeEnum"/>

列表中使用,给字段设置值:字段名

  1. <vxe-table
  2. v-else
  3. border
  4. highlight-hover-row
  5. highlight-current-row
  6. show-overflow
  7. row-id="id"
  8. ref="xTable"
  9. :data="itemList">
  10. <vxe-table-column field="itemType_dictText" title="类型" align="center" width="80"></vxe-table-column>
  11. </vxe-table>
现在最火的发帖平台

大学生创业项目寻找融资 DIY手工制作经营店创业计划书

2024-4-27 11:05:33

现在最火的发帖平台

有关环保的资料 环保证如何办理

2024-4-27 11:05:43

个人中心
购物车
优惠劵
今日签到
私信列表
搜索