package org.springblade.develop.constant; import java.util.HashMap; import java.util.Map; /** * 代码生成时用的一些常量 */ public interface EntityConstant { /** * 代码生成需要使用到的数据库字段类型,对应java数据类型的对应关系 * map的key是数据库字段数据类型 * map的value是java字段数据类型 */ MapentityDicMap = new HashMap () { { 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()); ListtablefieldList = tableInfo.getFields(); ArrayList 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.query().lambda().in(ModelPrototype::getModelId, ids)); if(!isModelPrototypeRemoved){ //TODO:处理保存失败逻辑 log.error("代码生成模块异常!","删除数据模型成功,但删除关联的 ModelPrototype 对象对应数据表失败!"); } // 由于 Code 使用了逻辑删除注解 @TableLogic 修饰删除 'isDeleted' 字段,实现了逻辑删除,非物理删除。 boolean isCodeRemoved = codeService.remove(Wrappers. query().lambda().in(Code::getModelId, ids)); if(!isCodeRemoved){ //TODO:处理保存失败逻辑 log.error("代码生成模块异常!","删除数据模型成功,但删除关联的 Code 对象对应数据表失败!"); } } return R.status(isModelDeleted); }
扫一扫访问 Blade技术社区 移动端