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);
}
扫一扫访问 Blade技术社区 移动端