解决bladex 3.0.1版本代码生成操作优化修改和BUG修复

Blade 未结 1 518

image.png

package org.springblade.develop.constant;

import java.util.HashMap;
import java.util.Map;

/**
 * 代码生成时用的一些常量
 */
public interface EntityConstant {
   /**
    * 代码生成需要使用到的数据库字段类型,对应java数据类型的对应关系
    * map的key是数据库字段数据类型
    * map的value是java字段数据类型
    */
   Map<String, String> entityDicMap = new HashMap<String, String>() {
      {
         put("String", "java.lang.String");
         put("Integer", "java.lang.Integer");
         put("Long", "java.lang.Long");
         put("Double", "java.lang.Double");
         put("BigDecimal", "java.math.BigDecimal");
         put("Boolean", "java.lang.Boolean");
         put("Date", "java.util.Date");
         put("LocalDateTime", "java.util.Date");

      }
   };
}


简化操作流程(可选):
1.本次代码修改效果是,如果创建数据模型,自动去insert 进入blade_model_prototype数据表内容,数据字段默认值来源于saber前端赋值逻辑代码。

@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("/model")
@Api(value = "数据模型表", tags = "数据模型表接口")
public class ModelController extends BladeController {
//其他未修改方法略
   
   /**
    * 新增或修改 数据模型表
    */
   @PostMapping("/submit")
   @ApiOperationSupport(order = 5)
   @ApiOperation(value = "新增或修改", notes = "传入model")
   public R submit(@Valid @RequestBody Model model) {
      // 保存前获取 model的主键,用于之后判定是新增还是保存
      Long modelIdBeforeSave = model.getId();
      boolean isSaved = modelService.saveOrUpdate(model);
      // 如果 isSaved == true 并且 modelIdBeforeSave ==null  说明是新增数据模型,blade_model_prototype插入数据
      if(isSaved && modelIdBeforeSave == null) {
         Long modelId = model.getId();
         String tableName = model.getModelTable();
         TableInfo tableInfo = getTableInfo(tableName, model.getDatasourceId());

         List<TableField> tablefieldList = tableInfo.getFields();
         ArrayList<ModelPrototype> modelPrototypes = new ArrayList<>();
         for (int i = 0; i < tablefieldList.size(); i++) {
            ModelPrototype modelPrototype = new ModelPrototype();
            TableField tableField = tablefieldList.get(i);
            BeanUtils.copyProperties(tableField, modelPrototype);
            // 首次加载配置默认值 (参考前端 Saber赋值的属性)
            modelPrototype.setIsList(1);
            modelPrototype.setIsForm(1);
            modelPrototype.setIsRow(0);
            modelPrototype.setIsRequired(0);
            modelPrototype.setIsQuery(0);
            modelPrototype.setComponentType("input");
            modelPrototype.setModelId(modelId);
            modelPrototype.setJdbcName(tableField.getName());
            // 修改数据库数据类型 LocalDateTime 对应java数据类型 Date
            if (modelPrototype.getPropertyType().equals("LocalDateTime")) {
               modelPrototype.setPropertyType("Date");
            }
            modelPrototype.setPropertyEntity(EntityConstant.entityDicMap.get(modelPrototype.getPropertyType()));
            modelPrototypes.add(modelPrototype);
            modelPrototype.setJdbcType(tableField.getPropertyType());
         }
         boolean isModelPrototypeSaved = modelPrototypeService.submitList(modelPrototypes);
         if(!isModelPrototypeSaved){
            //TODO:处理保存失败逻辑  根据自己情况事物回滚或是怎样处理
            log.error("代码生成模块异常1","创建数据模型成功,但尝试insert 数据表对应的字段list 失败 !");
         }

      }
      return R.status(isSaved);
   }

修复BUG(推荐修改):

2.解决数据表名没有下划线导致前端页面卡死情况

/**
 * 获取表信息
 *
 * @param tableName    表名
 * @param datasourceId 数据源主键
 */
private TableInfo getTableInfo(String tableName, Long datasourceId) {
   // 方法内其他代码略
      tableInfo = iterator.next();
      // fix:判定表名是否含有下划线,如果没有下划线避免表名被replace为空字符串,引起后续代码的异常。
      if(tableName.contains(StringPool.UNDERSCORE)) {
         tableInfo.setEntityName(tableInfo.getEntityName().replace(StringUtil.firstCharToUpper(tableName.split(StringPool.UNDERSCORE)[0]), StringPool.EMPTY));
      }else{
         tableInfo.setEntityName(StringUtil.firstCharToUpper(tableName));
      }
   }
   return tableInfo;
}

关联删除(推荐修改):
3. 删除数据模型后关联删除表字段以及代码生成配置相关数据库内容

@PostMapping("/remove")
@ApiOperationSupport(order = 6)
@ApiOperation(value = "逻辑删除", notes = "传入ids")
public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
   boolean isModelDeleted = modelService.deleteLogic(Func.toLongList(ids));
   // 如果数据模型删除成功,尝试删除下面的 modelPrototypes 数据模型属性(表字段)和 Code实体对应的代码生成的数据库里的数据
   if (isModelDeleted) {
      // 由于 ModelPrototype 继承了 BaseEntity 使用了逻辑删除处理,非物理删除。
      boolean isModelPrototypeRemoved = modelPrototypeService.remove(Wrappers.<ModelPrototype>query().lambda().in(ModelPrototype::getModelId, ids));
      if(!isModelPrototypeRemoved){
         //TODO:处理保存失败逻辑
         log.error("代码生成模块异常!","删除数据模型成功,但删除关联的 ModelPrototype 对象对应数据表失败!");
      }
      // 由于 Code  使用了逻辑删除注解 @TableLogic 修饰删除 'isDeleted' 字段,实现了逻辑删除,非物理删除。
      boolean isCodeRemoved = codeService.remove(Wrappers.<Code>query().lambda().in(Code::getModelId, ids));
      if(!isCodeRemoved){
         //TODO:处理保存失败逻辑
         log.error("代码生成模块异常!","删除数据模型成功,但删除关联的 Code 对象对应数据表失败!");
      }
   }
   return R.status(isModelDeleted);
}





1条回答
  • 2023-02-21 14:48

    感谢反馈

    0 讨论(0)
提交回复