13 Star 72 Fork 28

plume开源社区 / Plumecode

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 7.44 KB
一键复制 编辑 原始数据 按行查看 历史
chenlongfei 提交于 2021-11-24 17:39 . * 修改文档

PlumeCode

star fork License java version

一个简单易用且功能强大的代码生成器(Java & ElementUI),熟练使用你就是CURD代码挖掘机!!!

 ⭐⭐⭐新项目,需要大家的支持,欢迎Star、PR、Issue⭐⭐⭐  

PlumeCode 不仅简单、而且强大

  • 支持多数据库Mysql、H2、SqlServer、Oracle、PostgreSQL、MariaDB
  • 支持多种持久层框架MybatisPlus、Mybatis、Jpa、tk-Mybatis、Hibernate
  • 一键下载拥有portal、controller、service、repository、mapper、dto、entity、vo、query、mapper.xml等前后端代码
  • 良好的项目结构,让二次开发变得像喝水一样简单

quick start with cli

cli

quick start with web

jar包运行

  • 发行版下载
  • 启动项目
    java -jar plume-code-web-0.0.3.jar start

docker运行

docker pull yinyansheng/plumecode:v0.0.3
docker-pull
docker run -d yinyansheng/plumecode:v0.0.3
docker-run

功能简介

生成代码示例

plume-code-sample

联系交流

  • QQ群:691455148

测试地址

生成代码结构

后端框架

对于java后端项目框架设计,目前主要有两种:

  • 面向领域(DDD)
  • 面向数据(三层框架)

一般而言互联网后端C端业务并不复杂(相对B端或企业级项目),且通常也做了微服务,业务边界划分良好的话,DDD并不是一个好的选择,所以本项目基于三层框架生成后端代码

  • controller层(controller、vo、query)
  • servicer层(service、serviceImpl、dto)
  • repository层(repository/mapper/dao、repositoryImpl/daoImpl、entity)

下面是我常用的系统分层设计(参考自阿里巴巴代码规约)
project layer
以及我常用的包结构设计
package
以上都是个人理解,对于系统设计,没有银弹,适合的,符合场景的实践才是好的

前端框架

由于前端代码公司间差异比较大,这里只是做了ElementUI的示例,如有需要,可根据实际前端技术选型,做二次开发集成

项目结构

framework

二开说明

新增数据库

项目本身是基于JDBC获取数据库信息,数据库需要有JDBC实现

获取数据信息有两种方式

  • 通过JDBC Connection 获取DatabaseMetaData,从而获取数据库、表、字段、主键信息(推荐),只需要继承MetaDataDatabaseBehavior,且提供一个获取数据库名称的SQL即可
  • 通过JDBC执行Raw SQL获取数据库、表、字段、主键信息

database behavior class

Sample:新增PostgreSQL

@Component
@Scope(value = "prototype")
public class PostgreSQLDatabaseBehavior extends MetaDataDatabaseBehavior {

    @Override
    protected String getDatabaseNameSql() {
        return "SELECT current_database();";
    }
}

新增模板

tempalte behavior class 默认使用Velocity模板引擎、FreeMarker可选
新增模板文件
template file

新增后端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;
}

修改portal页面

Road Map

0.0.1 version

  • 支持 mysql、h2 --done
  • 支持 element-ui --done
  • 支持mybatis、mybatis-plus、jpa --done
  • 支持预览代码、获取代码 --done

0.0.2 version

  • 支持联合主键 --done
  • 支持sqlserver、oracle、PostgreSQL --done
  • 支持hibernate、tk-Mybatis --done
  • 支持Query 后缀配置 --done
  • 支持VO 后缀配置 --done
  • 支持DTO后缀配置 --done
  • 支持Entity后缀配置 --done
  • 支持Lombok --done

0.0.3 version

  • 支持cli运行 --done

0.0.4 version

  • 支持docker部署(部署plume-code) --done
Java
1
https://gitee.com/plumeorg/plume-code.git
git@gitee.com:plumeorg/plume-code.git
plumeorg
plume-code
Plumecode
main

搜索帮助