一个简单易用且功能强大的代码生成器(Java & ElementUI),熟练使用你就是CURD代码挖掘机!!!
⭐⭐⭐新项目,需要大家的支持,欢迎Star、PR、Issue⭐⭐⭐
PlumeCode 不仅简单、而且强大
java -jar plume-code-web-0.0.3.jar
docker pull yinyansheng/plumecode:v0.0.3
docker run -d yinyansheng/plumecode:v0.0.3
对于java后端项目框架设计,目前主要有两种:
一般而言互联网后端C端业务并不复杂(相对B端或企业级项目),且通常也做了微服务,业务边界划分良好的话,DDD并不是一个好的选择,所以本项目基于三层框架生成后端代码
下面是我常用的系统分层设计(参考自阿里巴巴代码规约)
以及我常用的包结构设计
以上都是个人理解,对于系统设计,没有银弹,适合的,符合场景的实践才是好的
由于前端代码公司间差异比较大,这里只是做了ElementUI的示例,如有需要,可根据实际前端技术选型,做二次开发集成
项目本身是基于JDBC获取数据库信息,数据库需要有JDBC实现
获取数据信息有两种方式
Sample:新增PostgreSQL
@Component
@Scope(value = "prototype")
public class PostgreSQLDatabaseBehavior extends MetaDataDatabaseBehavior {
@Override
protected String getDatabaseNameSql() {
return "SELECT current_database();";
}
}
默认使用Velocity模板引擎、FreeMarker可选
新增模板文件
新增后端java、xml模板实现类,继承JavaGeneratorBehavior类
@Component
@Scope("prototype")
class JpaControllerGeneratorBehavior extends JavaGeneratorBehavior {
//获取模板文件名
@Override
protected String getTemplateName() {
return "Jpa-Controller.java.tpl";
}
//获取文件包名(也是文件相对路径)
@Override
protected String getPackageName() {
return settingModel.getBasePackageName().concat(".admin.controller");
}
//获取文件名
@Override
protected String getFileName() {
return String.format("%sController.java", upperFirstCase(classModel.getName()));
}
}
新增前端js、vue模板实现类,继承VueGeneratorBehavior类
@Component
@Scope("prototype")
public class ElementUiTableGeneratorBehavior extends VueGeneratorBehavior {
//文件路径在基类中已经实现,如有调整需要重写父类getFilePath方法
//获取文件名
@Override
protected String getFileName() {
return "Table.vue";
}
//获取模板文件名
@Override
protected String getTemplateName() {
return "ElementUi-Table.vue.tpl";
}
}
protected Map<String, Object> getTemplateContext() {
Map<String, Object> templateContext = new HashMap<>(32);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
templateContext.put("setting", settingModel);
templateContext.put("createTime", simpleDateFormat.format(new Date()));
templateContext.put("className", classModel.getName());
templateContext.put("ClassName", upperFirstCase(classModel.getName()));
templateContext.put("tableName", classModel.getTableName());
templateContext.put("author", settingModel.getAuthor());
templateContext.put("comment", classModel.getComment());
templateContext.put("lombok", settingModel.getLombokState());
templateContext.put("fieldModelList", fieldModelList);
templateContext.put("isMultiplePK", fieldModelList.stream().filter(FieldModel::isPk).count() > 1);
templateContext.put("primaryKeyList", fieldModelList.stream().filter(FieldModel::isPk).collect(Collectors.toList()));
return templateContext;
}
如果有额外的变量,可以在模板实现类中重写基类getTemplateContext方法
@Override
protected Map<String, Object> getTemplateContext() {
Map<String, Object> templateContext = super.getTemplateContext();
templateContext.put("basePackageName", settingModel.getBasePackageName());
templateContext.put("packageName", getPackageName());
String servicePackageName = settingModel.getBasePackageName().concat(".service");
templateContext.put("servicePackageName", servicePackageName);
templateContext.put("typePackageNameList", getTypePackageNameList());
return templateContext;
}
略
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )