EBEasyBuild Docs
文档/后端/代码生成器

EasyFK Generator 代码生成器使用手册

最新版:3.2.12阅读时间 ~30 min

1. 概述

EasyFK Generator 是 易架构(EasyFK) 框架的核心代码生成工具,面向 Java / Spring Boot 技术栈的开发团队,提供 配置驱动、数据库感知、全层覆盖 的一站式代码生成能力。

核心能力:

  • 项目骨架生成:自动创建完整的 Maven / Gradle 多模块项目结构
  • 全层代码生成:Entity → Mapper → Repository → Service → API → Remote → Controller,一张表生成 8~15 个 Java 类
  • 数据库感知:直连数据库自动解析表结构、字段类型、注释等元数据
  • 多架构支持:单体(SINGLE)、微服务(MICROSERVICE)、多栈微服务(SMART)三种架构一键切换
  • 多 ORM 支持:MyBatis-Plus、MyBatis-Flex、Hibernate 三种 ORM 框架可选
  • 多构建工具:Maven、Gradle Groovy DSL、Gradle Kotlin DSL 三种构建方式
  • 增量安全:已有文件不覆盖,仅 DTO/Param 类随表结构刷新

两种使用方式:

  1. IntelliJ IDEA 插件(推荐):可视化操作界面,支持数据库导入表结构、分步生成、配置持久化,零学习成本
  2. CLI 命令行工具:脱离 IDE,一条命令完成全栈生成,适合自动化场景

2. 环境要求

项目要求
JDK21 或更高版本
IDE(插件方式)IntelliJ IDEA 2023.1 或更高版本
数据库(可选)使用数据库导入表结构时需要可连接的数据库实例

3. 方式一:IntelliJ IDEA 插件(推荐)

EasyFK Generator 提供了 IntelliJ IDEA 插件 EasyFK Generator,支持可视化操作界面,无需编写配置文件即可完成代码生成,是最便捷的使用方式。

3.1 插件安装

方式一:从插件市场安装(推荐)

  1. 打开 IntelliJ IDEA,进入 File → Settings → Plugins(macOS:IntelliJ IDEA → Preferences → Plugins
  2. 选择 Marketplace 标签页
  3. 搜索
  4. 点击 Install,安装完成后重启 IDE
TIP
提示: 如果在插件市场中搜索不到 EasyFK Generator,可以从 JetBrains 插件官方页面手动下载安装包:
plugins.jetbrains.com/plugin/30796-easyfk-generator/versions#tabs
下载最新版本的 .zip 文件后,按照下方“从本地磁盘安装”的方式进行安装。

方式二:从本地磁盘安装

  1. 获取插件安装包 easyfk-generator-idea-x.x.x.zip
  2. 打开 IntelliJ IDEA,进入 File → Settings → Plugins
  3. 点击齿轮图标 ⚙ → Install Plugin from Disk...
  4. 选择下载的.zip 文件,安装完成后重启 IDE

3.2 核心特性

  • 可视化配置:通过对话框填写项目配置、模型配置、代码配置,无需手写 YAML
  • 数据库导入:可视化连接数据库,勾选需要导入的表,自动生成模型定义
  • 分步生成:对话框底部提供 “生成项目”、“生成模型”、“生成业务代码”、“生成自动装配” 四个独立按钮
  • 工具窗口:右侧面板快速入口,按场景分组(新建项目 / 增量生成 / 单独生成)
  • 配置持久化:自动保存 .easyfk-generator.json 到项目根目录,下次打开自动加载
  • 快捷键Ctrl + Alt + Z 快速打开代码生成对话框

3.3 插件入口

入口说明
File → New → EasyFK Project新建项目,创建项目骨架并生成代码
Generate → EasyFK 增量生成在已有项目中生成代码,已有文件不覆盖(Ctrl + Alt + Z)
Generate → EasyFK 生成业务代码仅生成 Repository / Service / API / Remote / Controller
Generate → EasyFK 刷新模型 (字段变更)重新生成 Entity / Mapper + DTO / Param
Generate → EasyFK 刷新 DTO/Param仅重新生成 DTO 和 Param 类
Generate → EasyFK 生成自动装配生成 Spring Boot AutoConfiguration
右侧工具窗口 → EasyFK按场景分组的快捷操作面板

3.4 全局设置

File → Settings → Tools → EasyFK Generator:

设置项说明默认值
默认作者代码注释中的 @authoreb-jack
默认框架版本EasyFK 框架版本号3.2.12
生成后自动刷新项目树生成完成后自动刷新 IDEA 项目目录开启
生成后弹出结果统计生成完成后弹出结果信息对话框开启
TIP
详细的 IDEA 插件使用说明请参阅 easyfk-generator-idea/USER_MANUAL.md

4. 方式二:CLI 命令行工具

CLI 工具独立运行,不依赖 IDE 和 Spring Boot 项目环境,适合从零创建新项目、在任意目录快速生成代码,或配合 CI/CD 自动化流程使用。

4.1 安装

下载 efg.zipCLI 安装包 · 约 31 MB
  1. 获取安装包 efg-3.2.12.zip 并解压
  2. 进入 efg-3.2.12 目录执行安装

Windows:

bat
双击 install.bat

macOS / Linux:

bash
chmod +x install && ./install

重新打开终端,验证安装:

bash
efg -V

输出以下内容表示安装成功:

plaintext
easyfk-generator 3.2.12

4.2 卸载

Windows: 双击 uninstall.bat

macOS / Linux:

bash
chmod +x uninstall && ./uninstall

4.3 快速开始

bash
# 1. 创建工作目录
mkdir my-project && cd my-project

# 2. 生成配置模板
efg init

# 3. 用编辑器打开 generator.yml,填入项目信息、app-type 和数据库配置

# 4. 执行全量生成
efg

4.4 CLI 命令参考

基本语法

bash
efg [选项]
efg init [-o 文件名]

生成命令

命令说明
efg全量生成(项目骨架 + Entity + Mapper + 业务代码 + 自动装配配置)
efg -p仅生成项目骨架(目录结构 + 构建文件)
efg -m仅生成 Entity + Mapper(包含 Mapper XML)
efg -s仅生成业务代码(Repository / Service / API / Remote / Controller + DTO/Param 等)
efg -a仅生成自动装配配置(AutoConfiguration)
efg -d仅刷新 DTO 和 Param(数据库表结构变更后使用,不影响其他代码)

组合使用

Flag 可以组合使用:

命令说明
efg -pm项目骨架 + Entity + Mapper(新项目初始化第一步)
efg -sa业务代码 + 自动装配配置(新增业务表后的第二步)
efg -pms项目骨架 + Entity + 全部业务代码

其他选项

选项说明
-c <文件>指定配置文件路径(默认读取当前目录下的 generator.yml)
-h, --help查看帮助信息
-V, --version查看版本号

init 子命令

命令说明
efg init在当前目录生成 generator.yml 配置模板
efg init -o my-config.yml指定输出文件名

4.5 典型使用场景

场景一:从零创建新项目

bash
mkdir my-project && cd my-project
efg init                    # 生成配置模板
# 编辑 generator.yml,填入所有配置
efg                         # 全量生成

场景二:已有项目新增业务表

  1. 在数据库中创建新表
  2. 修改 generator.yml,在 from-db-tables 中添加新表名(或在 model-list 中新增 Model 定义)
  3. 分步执行:
bash
efg -m                      # 生成新表的 Entity + Mapper
efg -s                      # 生成对应的业务代码
efg -a                      # 刷新自动装配配置(SMART 架构需要)

或一步到位:

bash
efg                         # 全量生成(已有文件不会被覆盖)

场景三:数据库表结构变更(新增/修改字段)

bash
efg -m                      # 重新生成 Entity(会覆盖)
efg -d                      # 刷新 DTO 和 Param(会覆盖)
TIP
其他文件(Service、Controller 等)不会被重新生成,需要手动在对应文件中添加新字段的逻辑。

场景四:使用不同配置文件管理多环境

bash
efg -c dev-generator.yml            # 开发环境配置
efg -c prod-generator.yml -m        # 生产环境,仅生成 Model

场景五:仅生成项目骨架(不涉及业务代码)

bash
efg -p                      # 生成目录结构和构建文件,可以先搭建好项目结构再逐步添加业务

4.6 完整配置示例

以下是 CLI 方式下 generator.yml 配置文件的完整示例,覆盖不同架构和典型场景。

4.6.1 单体项目(最小配置)

yaml
easyfk:
  config:
    generator:
      project:
        project-dir: D:\workspace\projects
        group-id: com.example
        project-name: my-app
        base-package: com.example.myapp
        project-type: single
        app-type: BMS
      code:
        module-name: myapp
        model-list:
          - model-name: Product
            model-desc: 商品信息
          - model-name: Order
            model-desc: 订单信息

4.6.2 微服务项目(Spring Cloud)

yaml
easyfk:
  config:
    generator:
      project:
        project-dir: D:\workspace\projects
        group-id: com.example
        project-name: order-service
        base-package: com.example.order
        project-type: microservice
        rpc-type: cloud
        prd-type: single
        build-type: gradle
        app-type: CLIENT
        framework-version: 3.2.12
      code:
        module-name: order
        author: 开发者
        db-type: MYSQL
        db-short-url: localhost:3306/order_db
        db-user: root
        db-pwd: 123456
        from-db-tables: t_order,t_order_item
        table-prefix: t_

4.6.3 微服务项目(Dubbo)

yaml
easyfk:
  config:
    generator:
      project:
        project-dir: D:\workspace\projects
        group-id: com.example
        project-name: user-service
        base-package: com.example.user
        project-type: microservice
        rpc-type: dubbo
        prd-type: separation
        build-type: maven
        app-type: BMS
        framework-version: 3.2.12
      code:
        module-name: user
        db-type: POSTGRE_SQL
        db-short-url: localhost:5432/user_db
        db-user: postgres
        db-pwd: 123456
        from-db-tables: user_info,user_address
        model-list:
          - model-name: UserInfo
            model-desc: 用户信息
            forbidden-filed: status
          - model-name: UserAddress
            model-desc: 收货地址

4.6.4 多栈微服务项目(SMART)

yaml
easyfk:
  config:
    generator:
      project:
        project-dir: D:\workspace\projects
        group-id: com.mcst
        project-name: trading
        base-package: com.mcst.trading
        project-type: smart
        prd-type: separation
        build-type: gradle
        gradle-type: groovy
        orm-type: MYBATIS
        log-type: LOGBACK
        app-type: BMS
        framework-version: 3.2.12
        project-version: 1.0.0-SNAPSHOT
        controller-auto-config: true
      code:
        module-name: trading
        author: 开发团队
        orm-type: MYBATIS
        spring-annotation: true
        create-controller: true
        db-type: MYSQL
        db-short-url: 192.168.1.100:3306/trading_db
        db-user: root
        db-pwd: secure_password
        table-prefix: t_
        from-db-tables: t_product,t_order,t_order_item,t_payment
        model-list:
          - model-name: Product
            model-desc: 商品
          - model-name: Order
            model-desc: 订单
          - model-name: OrderItem
            model-desc: 订单明细
            only-repository: true
          - model-name: Payment
            model-desc: 支付记录
            create-controller: false

4.6.5 从数据库自动解析表结构

yaml
easyfk:
  config:
    generator:
      project:
        project-dir: D:\workspace\projects
        group-id: com.example
        project-name: my-app
        base-package: com.example.myapp
        project-type: single
        app-type: BMS
      code:
        module-name: myapp
        db-type: MYSQL
        db-short-url: localhost:3306/my_database
        db-user: root
        db-pwd: 123456
        table-prefix: base_
        from-db-tables: base_product,base_category,base_brand

工作原理:

  1. 生成器通过 JDBC 连接数据库
  2. 使用 DatabaseMetaData 获取表结构(字段名、类型、注释、主键等)
  3. 自动去除表前缀(base_productProduct
  4. 将下划线字段名转为驼峰命名(product_nameproductName
  5. 按类型映射规则转换 Java 类型
  6. 读取字段注释作为 @Schema@Column 的描述

4.6.6 带资源权限注解的配置

yaml
easyfk:
  config:
    generator:
      project:
        project-dir: D:\workspace\projects
        group-id: com.mcst
        project-name: user
        base-package: com.mcst.user
        project-type: smart
        prd-type: separation
        build-type: gradle
        app-type: BMS
      code:
        module-name: user
        db-short-url: localhost:3306/user_db
        db-pwd: 123456
        create-resource-annotation: true
        resource-group: userManagement
        resource-id: userManagement
        resource-name: 用户管理
        resource-path: /user
        resource-sort: 80000
        module-resource-sort: 10000
        increment-star: 100
        model-list:
          - model-name: UserInfo
            model-desc: 会员
          - model-name: UserAddress
            model-desc: 收货地址
          - model-name: UserAccount
            model-desc: 账号

排序值自动计算:

  • UserInfo: modelResourceSort = 10000 + 100 = 10100
  • UserAddress: modelResourceSort = 10000 + 200 = 10200
  • UserAccount: modelResourceSort = 10000 + 300 = 10300

5. 通用配置详解

5.1 配置文件结构

无论是 CLI 的 generator.yml 还是 IDEA 插件的可视化配置,底层配置结构完全一致,均位于 easyfk.config.generator 节点下:

yaml
easyfk:
  config:
    generator:
      project:    # 项目配置
        ...
      code:       # 代码配置
        ...
TIP
IDEA 插件的可视化配置会自动保存为 .easyfk-generator.json 文件,与 YAML 配置内容等价。

5.2 项目配置(project)

配置前缀:easyfk.config.generator.project

配置项必填类型默认值说明
project-dirString-项目输出根目录。例:D:\workspace\projects
group-idString-Maven groupId,例:com.example
project-nameString-项目名称,同时作为项目根目录名和各子模块名前缀。例:my-app
base-packageString-Java 包根路径。例:com.example.myapp
project-type枚举smart项目架构类型:single / microservice / smart
rpc-type枚举cloudRPC 类型,仅 microservice 时生效。cloud / dubbo
build-type枚举maven构建工具:maven → pom.xml;gradle → build.gradle
gradle-type枚举groovyGradle DSL 类型,仅 build-type: gradle 时生效。groovy / kotlin
orm-type枚举MYBATISORM 框架:MYBATIS / MYBATIS_FLEX / HIBERNATE
prd-type枚举nonePRD / Controller 层策略:none / single / separation
log-type枚举LOGBACK日志框架:LOGBACK / LOG4J2
framework-versionString3.2.12EasyFK 框架版本号
project-versionString1.0.0-SNAPSHOT生成的项目版本号
app-type枚举-应用类型,决定生成的项目模板和配置风格。可选值:BMS(后台管理端)、CLIENT(面向 C 端)
create-prd-projectBooleantrue是否生成 PRD(Controller)子项目
create-repositoryBooleanfalse是否生成独立的 Repository 子项目
controller-auto-configBooleanfalse是否为 Controller 层生成 AutoConfiguration 自动装配配置

project-type 详细说明

说明
single单体项目,所有代码在一个工程中,无子模块拆分
microservice标准微服务架构,生成 API + Server + PRD 模块,支持选择一种 RPC 方式(Cloud 或 Dubbo)
smart多栈微服务,在 microservice 基础上同时生成 Spring Cloud 和 Dubbo 两套 RPC 远程调用通道

5.3 代码配置(code)

配置前缀:easyfk.config.generator.code

基本配置

配置项必填类型默认值说明
module-nameString-模块名称,用于配置类名、远程调用 serviceId、Controller 路径前缀等。例:myapp
authorStringeb-jack代码注释中的作者信息
orm-type枚举MYBATISORM 类型:MYBATIS / MYBATIS_FLEX / HIBERNATE
spring-annotationBooleantrue是否在实现类上添加 Spring 注解(如 @Repository、@Service)。project-type 为 smart 时无效
create-controllerBooleantrue是否生成 Controller 层代码(全局控制,可被 Model 级别覆盖)
extends-supper-classBooleantrueEntity 是否继承框架基类,基类提供 deleted、insertTime、lastUpdateTime 字段

数据库连接配置

配置项必填类型默认值说明
db-type枚举MYSQL数据库类型
db-short-url条件必填String-数据库短连接地址,格式:host:port/database。仅使用 from-db-tables 时必填
db-userStringroot数据库用户名
db-pwd条件必填String-数据库密码。仅使用 from-db-tables 时必填
TIP
连接字符串格式说明: db-short-url 只需填写 host:port/database 部分,生成器会自动拼接完整的 JDBC URL。例如 MySQL 会自动拼接为 jdbc:mysql://host:port/database?characterEncoding=UTF-8&useSSL=false&...

表配置

配置项必填类型默认值说明
table-prefixString-全局表名前缀,生成类名时自动去除。例:配置 base_,表 base_product → 类名 Product
from-db-tablesString-需要从数据库读取结构的表名列表,逗号分隔。例:product,order,user_info

5.4 Model 定义配置

Model 定义在 code.model-list 节点下,是一个列表。每个 Model 对应数据库中的一张表,也对应生成的一组完整分层代码。

yaml
code:
  model-list:
    - model-name: Product
      model-desc: 商品信息
      # ... 更多配置
    - model-name: Order
      model-desc: 订单信息

Model 配置项详解

配置项必填类型默认值说明
model-nameString-模型名称,大驼峰命名。对应所有类名前缀
model-descString-模型中文描述,用于代码注释、Swagger 文档描述等
table-nameString自动推导对应的数据库表名。不填则根据 model-name 自动推导
id-typeStringString主键字段的 Java 类型:String 或 Long
id-is-autoBooleanfalse主键是否自增
super-classStringBaseMyBatisPlusEntityEntity 父类的完全限定类名
only-repositoryBooleanfalse是否只生成 Repository 层
create-controllerBooleantrue是否为该 Model 生成 Controller
table-prefixString继承全局该 Model 专属的表前缀
forbidden-filedString-禁用字段名(如 status),设置后 Controller 生成启用/禁用接口
resource-groupString继承全局该 Model 的资源权限分组
resource-nameString继承全局该 Model 的资源权限名称
resource-idString继承全局该 Model 的资源权限 ID
resource-pathString继承全局该 Model 的资源权限前端路由路径
resource-sortInteger继承全局资源组排序值
model-resource-sortInteger自动计算当前 Model 的资源排序值
TIP
from-db-tables 和 model-list 的关系: 两者可以同时使用。from-db-tables 自动从数据库读取表结构生成 Model 信息。如果同一个 Model 在 model-list 中也有定义,则 model-list 中的配置作为覆盖项优先生效。

5.5 资源权限配置

配置前缀:easyfk.config.generator.code

配置项必填类型默认值说明
create-resource-annotationBooleanfalse总开关:是否生成资源权限注解
resource-groupString-资源所属分组标识
resource-nameString-资源所属分组的显示名称
resource-idString-资源分组 ID
resource-pathString-资源分组对应的前端路由路径
resource-sortInteger10000资源分组的排序基础值
module-resource-sortInteger10000各 Model 资源排序的起始值
increment-starInteger100多个 Model 之间排序值的自增步长

启用后生成的 Controller 示例注解:

java
@ResourceController(group = "operationSetting", id = "operationSetting",
    name = "运营管理", sort = 81000, path = "/operation")
public class ProductController {

    @AuthResource(id = "productManage", name = "商品管理",
        pId = "operationSetting", pName = "运营管理",
        sort = 10100, path = "/operation/product",
        category = ResourceCategory.menu)
    public ResponseResult<List<ProductResp>> queryPage(...) { ... }
}

6. 项目架构类型详解

EasyFK Generator 内置四种项目架构,覆盖从小型工具到大型平台的不同场景。

6.1 SINGLE 单体架构

适用场景: 中小型项目、快速原型验证、内部工具系统

配置: project-type: single

生成的项目结构:

plaintext
my-app/
├── pom.xml (或 build.gradle)
├── src/main/java/com/example/myapp/
│   ├── ServerApp.java                          # 启动类
│   ├── controller/
│   │   └── ProductController.java              # Controller(直接调用 Service)
│   ├── api/
│   │   ├── dto/ProductDto.java                 # DTO
│   │   ├── param/ProductParam.java             # 查询参数
│   │   ├── request/
│   │   │   ├── ProductReq.java                 # 请求对象
│   │   │   └── ProductEditReq.java             # 编辑请求对象
│   │   └── response/ProductResp.java           # 响应对象
│   └── service/
│       ├── IProductService.java                # 服务接口
│       ├── impl/ProductServiceImpl.java        # 服务实现
│       ├── persistence/
│       │   ├── model/Product.java              # Entity
│       │   └── mapper/ProductMapper.java       # Mapper 接口
│       └── repository/
│           ├── IProductRepository.java         # 仓储接口
│           └── impl/ProductRepositoryImpl.java # 仓储实现
├── src/main/resources/
│   └── mappings/ProductMapper.xml              # Mapper XML
└── config/
    ├── application.yml
    ├── application-dev.yml
    ├── application-test.yml
    ├── application-prod.yml
    └── logback.xml (或 log4j2.xml)

特点

  • 所有代码在同一个工程中
  • Controller 直接依赖 Service 层,无 Remote/API 中间层
  • {basePackage}.service 代替 {basePackage}.server
  • Service 接口路径使用 {basePackage}.api

6.2 MICRO_PRD 微服务产品层架构

适用场景: BMS 后台管理端、ToC 端的接口网关项目,仅提供 REST API 接口,本身无业务逻辑,通过 RPC 调用后端微服务获取数据

配置: project-type: micro_prdrpc-type: clouddubbo(必选)

生成的项目结构:

plaintext
my-app/
├── pom.xml (或 build.gradle + settings.gradle)
├── src/main/java/com/example/myapp/
│   └── MyappPrdApp.java                          # 启动类(含 RPC 注解)
└── config/
    ├── application.yml
    ├── application-dev.yml
    ├── application-test.yml
    ├── application-prod.yml
    └── logback.xml (或 log4j2.xml)

特点

  • 与 SINGLE 类似的扁平结构(单模块),但依赖完全不同
  • RPC 必选:必须选择 CLOUD 或 DUBBO 作为远程调用方式
  • 无 ORM/DB:不包含任何数据库相关依赖
  • 无业务代码:不生成 Entity、Mapper、Repository、Service、DTO、Param、Controller 等
  • 仅骨架代码:只生成启动类、配置文件、日志配置
  • 运行时引入各业务模块的 API 接口项目(如 xxx-cloud-api 或 xxx-dubbo-api),通过 RPC 进行远程调用
  • 包含 web-prddoc-knife4jregistry-nacosrpc-${rpcType} 等依赖
  • 可选引入 auth-prd(BMS 时)和 auth-${rpcType}-api(认证模块的 RPC 接口)

典型使用流程

  1. 使用 MICRO_PRD 生成项目骨架和基础配置
  2. 手动在 pom.xml / build.gradle 中引入需要调用的微服务 API 模块依赖
  3. 手动编写 Controller,注入各微服务的 Remote/API 接口进行远程调用
  4. 配置 Nacos 注册中心地址,启动项目

6.3 MICROSERVICE 微服务架构

适用场景: 标准微服务拆分,使用单一 RPC 协议(Spring Cloud 或 Dubbo)

配置: project-type: microservicerpc-type: clouddubbo

生成的项目结构(以 Spring Cloud 为例):

plaintext
my-app/
├── pom.xml (或 build.gradle + settings.gradle)    # 父工程
│
├── my-app-api/                                     # API 定义模块
│   ├── pom.xml
│   └── src/main/java/com/example/myapp/api/
│       ├── IProductApi.java                        # API 接口(仅 SMART 架构生成)
│       ├── dto/ProductDto.java
│       ├── param/ProductParam.java
│       ├── request/
│       │   ├── ProductReq.java
│       │   └── ProductEditReq.java
│       └── response/ProductResp.java
│
├── my-app-server/                                  # 服务实现模块
│   ├── pom.xml
│   ├── src/main/java/com/example/myapp/
│   │   ├── ServerApp.java                          # 启动类
│   │   └── server/
│   │       ├── persistence/model/Product.java
│   │       ├── persistence/mapper/ProductMapper.java
│   │       ├── repository/
│   │       │   ├── IProductRepository.java
│   │       │   └── impl/ProductRepositoryImpl.java
│   │       ├── service/
│   │       │   ├── IProductService.java
│   │       │   └── impl/ProductServiceImpl.java
│   │       └── impl/
│   │           └── ProductRemoteImpl.java          # RPC 实现
│   ├── src/main/resources/mappings/ProductMapper.xml
│   └── config/
│       ├── application.yml / -dev.yml / -test.yml / -prod.yml
│       └── logback.xml
│
└── my-app-prd/                                     # PRD 层(Controller)
    ├── pom.xml
    └── src/main/java/com/example/myapp/
        ├── ClientApp.java                          # 启动类
        └── controller/
            └── ProductController.java              # Controller(通过 Remote 调用 Server)

prd-type: separation 时,PRD 层会分为两个独立项目(与 server 平级):

plaintext
my-app/
├── ...
├── my-app-prd-client/    # C 端 / 用户端 Controller
│   ├── ClientApp.java
│   └── controller/ProductController.java
└── my-app-prd-bms/       # B 端 / 管理后台 Controller
    ├── BmsApp.java
    └── controller/ProductBmsController.java

6.4 SMART 多栈微服务架构

适用场景: 大型平台项目,需要同时支持 Spring Cloud 和 Dubbo 两种 RPC 协议

配置: project-type: smart

生成的项目结构:

plaintext
my-app/
├── pom.xml
│
├── my-app-api/                                     # API 定义模块
│   └── com/example/myapp/api/
│       ├── IProductApi.java                        # 统一 API 接口
│       ├── dto/ProductDto.java
│       ├── param/ProductParam.java
│       ├── request/ProductReq.java / ProductEditReq.java
│       └── response/ProductResp.java
│
├── my-app-server/                                  # 服务实现模块
│   └── com/example/myapp/server/
│       ├── persistence/model/Product.java
│       ├── persistence/mapper/ProductMapper.java
│       ├── repository/IProductRepository.java + impl/
│       ├── service/IProductService.java + impl/
│       ├── impl/ProductApiServerImpl.java          # API 服务端实现
│       └── config/MyappServerConfig.java           # 自动装配配置
│
├── my-app-remote/                                  # 远程调用模块(父项目)
│   │
│   ├── my-app-cloud-api/                           # Spring Cloud 客户端
│   │   └── com/example/myapp/remote/
│   │       ├── IProductRemote.java                 # Feign 接口
│   │       ├── impl/ProductApiScImpl.java          # API 的 SC 实现
│   │       ├── properties/MyappApiProperties.java  # 配置属性
│   │       └── config/MyappApiConfig.java          # 自动装配
│   │
│   ├── my-app-cloud-provider/                      # Spring Cloud 服务提供者
│   │   └── com/example/myapp/remote/provider/
│   │       └── impl/ProductRemoteImpl.java         # Remote 实现
│   │
│   ├── my-app-dubbo-api/                           # Dubbo 客户端
│   │   └── com/example/myapp/remote/
│   │       ├── IProductRemote.java                 # Dubbo 接口
│   │       └── impl/ProductApiDubboImpl.java       # API 的 Dubbo 实现
│   │
│   └── my-app-dubbo-provider/                      # Dubbo 服务提供者
│       └── com/example/myapp/remote/provider/
│           └── impl/ProductRemoteImpl.java
│
├── my-app-prd-client/                                 # PRD / Controller 层(C 端)
│   └── controller/ProductController.java
│
└── my-app-prd-bms/                                    # PRD / Controller 层(B 端)
    └── controller/ProductBmsController.java

SMART 架构的关键特点

  • 定义了统一的 IProductApi 接口
  • Server 模块实现 ProductApiServerImpl(本地直接调用 Service)
  • Cloud API 模块实现 ProductApiScImpl(通过 Feign 远程调用)
  • Dubbo API 模块实现 ProductApiDubboImpl(通过 Dubbo 远程调用)
  • Controller 层依赖 API 接口,运行时通过 Spring Boot AutoConfiguration 自动注入对应的实现
  • 切换调用方式只需更换依赖包,无需修改业务代码

6.5 灵活组合项目架构

四种内置架构并非固定不变的模板,而是通过多个配置维度的组合来决定最终生成的项目结构。开发团队可以根据业务需求,灵活调整以下配置维度来定制适合自己的项目架构。

项目结构维度

通过 project-type + prd-type 的组合:

project-typeprd-type生成的子模块
single(不适用)单一工程,所有代码在一个项目中
micro_prd(不适用)单一工程,仅启动类 + 配置文件,无业务代码
microservicenoneapi + server(无 Controller 层项目)
microservicesingleapi + server + prd
microserviceseparationapi + server + prd-client + prd-bms
smartnoneapi + server + remote(含 cloud/dubbo 四个子模块)
smartsingleapi + server + remote + prd
smartseparationapi + server + remote + prd-client + prd-bms
TIP
例如:只需要后端 API 服务、不需要 Controller 层的项目,使用 microservice + prd-type: none 即可。

构建工具维度

build-type生成的构建文件
mavenpom.xml
gradlebuild.gradle + settings.gradle(Groovy DSL)

技术栈维度

配置项影响范围
orm-type持久化依赖和 Entity 代码风格:MyBatis-Plus(默认)→ @TableName + BaseMapper;MyBatis-Flex → Flex 风格注解;Hibernate → JPA 注解
rpc-typeMICROSERVICE 和 MICRO_PRD 架构生效(MICRO_PRD 时必选),决定 RPC 调用方式和相关依赖
log-type日志配置文件:logback.xml 或 log4j2.xml
db-type构建文件中的数据库驱动依赖(如 MySQL / PostgreSQL),以及 JDBC URL 拼接规则
include-auth是否在构建文件中引入 EasyFK 框架的 auth 权限模块依赖

代码层裁剪维度

配置项作用域说明
only-repositoryModel 级设为 true 时只生成 Entity + Mapper + Repository + DTO,不生成 Service / API / Controller / Remote
create-controller全局 / Model 级控制是否生成 Controller 层代码,Model 级配置优先于全局配置
controller-auto-config全局SMART 架构下,是否为 Controller 层额外生成 Spring Boot AutoConfiguration 自动装配配置

典型定制场景

场景一:纯后端微服务(无 Controller)

yaml
project-type: microservice
rpc-type: cloud
prd-type: none          # 不生成 PRD(Controller)子项目

场景二:SMART 架构 + 部分 Model 只要数据层

yaml
project-type: smart
prd-type: separation
code:
  model-list:
    - model-name: Order
      model-desc: 订单
    - model-name: OrderItem
      model-desc: 订单明细
      only-repository: true       # 只生成数据访问层
    - model-name: Payment
      model-desc: 支付记录
      create-controller: false    # 有 Service 但不生成 Controller

场景三:单体项目使用 Gradle + MyBatis-Flex

yaml
project-type: single
build-type: gradle
orm-type: MYBATIS_FLEX
app-type: BMS
TIP
总结: 四种内置架构是推荐的最佳实践起点。通过 project-type 等组合配置,可灵活定制业务场景需求。

7. 生成代码详解

以下以 Model 名为 Product、模块名为 myapp 为例说明生成的各层代码。

7.1 Entity 实体类

文件: Product.java 位置: {server}/persistence/model/

生成 MyBatis-Plus(默认):

java
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("product")
@AutoMapper(target = ProductDto.class)
public class Product extends BaseMyBatisPlusEntity<Product> {

    @PrimaryKey
    @TableId(type = IdType.ASSIGN_UUID)
    @EntityColumn(comment = "商品信息ID")
    private String productId;

    @EntityColumn(comment = "商品名称")
    private String productName;

    @EntityColumn(comment = "商品价格")
    private BigDecimal price;
}

7.2 Mapper 接口与 XML

Mapper 接口: ProductMapper.java

java
public interface ProductMapper extends BaseMapper<Product> {
}

Mapper XML: ProductMapper.xml — 位于 resources/mappings/ 目录

7.3 DTO 数据传输对象

文件: ProductDto.java 位置: {api}/dto/

java
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@Schema(description = "商品信息数据对象")
@SuperBuilder
@NoArgsConstructor
public class ProductDto extends BaseDto {

    @PrimaryKey
    @Schema(description = "商品信息ID")
    private String productId;

    @Schema(description = "商品名称")
    private String productName;

    @Schema(description = "商品价格")
    private BigDecimal price;
}

7.4 Param 查询参数对象

文件: ProductParam.java 位置: {api}/param/

java
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@Schema(description = "商品信息数据参数对象")
@SuperBuilder
@NoArgsConstructor
public class ProductParam extends BasicParam {

    @Schema(description = "商品名称")
    private String productName;

    @Schema(description = "商品价格")
    private BigDecimal price;
}

7.5 Req 请求对象

文件: ProductReq.java

java
public class ProductReq extends ProductParam {
}

7.6 Resp 响应对象

文件: ProductResp.java

java
public class ProductResp extends ProductDto {
}

7.7 EditReq 编辑请求对象

文件: ProductEditReq.java

java
public class ProductEditReq extends ProductDto {
}

7.8 Repository 仓储层

接口: IProductRepository.java

java
public interface IProductRepository extends IBaseRepository<ProductDto, String> {
}

实现: ProductRepositoryImpl.java

java
@Repository
public class ProductRepositoryImpl
    extends BaseMyBatisRepositoryImpl<ProductMapper, ProductDto, Product, String>
    implements IProductRepository {
}

7.9 Service 服务层

接口: IProductService.java

java
public interface IProductService extends IBaseService<ProductResp, String, ProductReq> {
}

7.10 API 接口层

仅 SMART 架构生成。

文件: IProductApi.java

java
public interface IProductApi extends IBaseApi<ProductResp, String, ProductReq> {
}

7.11 Controller 控制器层

project-typeprd-type生成的 Controller
singlesingle直接注入 IProductService,本地调用
microservice + cloudsingle注入 Remote 接口(Feign),远程调用
microservice + dubbosingle注入 Remote 接口(Dubbo),远程调用
smartsingle注入 IProductApi,具体实现由自动装配决定
任意separation同时生成 ProductController(C 端)和 ProductBmsController(B 端)

7.12 SpringCloud Remote 远程调用层

java
@FeignClient(value = "${easyfk.config.remote.myapp.service-id:server}",
    path = "${easyfk.config.remote.myapp.base-path:/remote}/myapp/product")
public interface IProductRemote extends IBaseRemote<ProductResp, String, ProductReq> {
}

7.13 Dubbo Remote 远程调用层

java
public interface IProductRemote extends IDubboBaseRemote<ProductResp, String, ProductReq> {
}

7.14 AutoConfiguration 自动装配

主要用于 SMART 架构,以及启用了 controller-auto-config 的微服务架构。自动为 Server、API、Provider 及 Controller 模块生成自动装配类并注册配置。

7.15 启动类与配置文件

非 SINGLE 架构会生成单独的启动类,例如 ServerApp.javaClientApp.java 等,以及各环境适用的配置和日志文件。

8. 数据库支持与类型映射

8.1 支持的数据库

支持多达 22 种数据库:MYSQL, MARIADB, POSTGRE_SQL, ORACLE, ORACLE_12C, SQL_SERVER 等等。

8.2 字段类型映射规则

数据库字段类型Java 类型
DATETIME, TIMESTAMPLocalDateTime
DATELocalDate
TIMELocalTime
DECIMAL, NUMERICBigDecimal
TINYINT, BOOLEAN, BITBoolean
INT, INT4, INTEGERInteger
BIGINT, NUMBER, INT8Long
DOUBLE, FLOATDouble
VARCHAR, CHAR, TEXT, CLOBString

9. Entity 自定义注解说明

在已生成的 Entity 文件中,可以手动添加以下 EasyFK 框架提供的自定义注解,再次执行代码生成即可应用到各层中。

@SingleUniqueField — 单字段唯一校验

java
@SingleUniqueField(repetitionMsg = "商品名称已存在")
@EntityColumn(comment = "商品名称")
private String productName;

@CombUniqueField — 组合唯一校验

java
@CombUniqueField(repetitionMsg = "该分类下已存在同名商品", combinationField = "categoryId")
private String productName;

@BetweenConditionField — 区间查询字段

java
@BetweenConditionField
private LocalDateTime createTime;

会自动生成 createTimeStartcreateTimeEnd 查询字段。

@ForbiddenField — 禁用字段

java
@ForbiddenField(value = "forbidden")

标注在 Entity 类上,会自动生成启用/禁用功能。

10. 文件覆盖策略

策略涉及文件行为
不存在才创建Mapper 接口/XML, Repository, Service, API, Controller, Remote, Req/Resp, 启动类, 配置文件文件已存在则跳过,绝不覆盖
删除后重建Entity, DTO, Param, AutoConfiguration 配置类每次生成都会删除旧文件并重新生成

11. 常见问题(FAQ)

Q1: 提示"找不到 java"

请安装 JDK 21 或更高版本:adoptium.net

安装后确认 java -version 输出的版本 >= 21。

Q2: 生成的代码会覆盖我手动修改的文件吗?

不会(大部分情况下)。

  • 不会覆盖的文件:Mapper 接口、Mapper XML、Repository、Service、API、Controller、Remote、Req、Resp、EditReq、启动类、配置文件
  • 会覆盖的文件:Entity、DTO、Param、AutoConfiguration 配置类

Q3: from-db-tables 和 model-list 有什么区别?

特性from-db-tablesmodel-list
字段信息来源自动从数据库读取手动定义或配合 from-db-tables 使用
是否需要数据库连接
字段类型/注释自动解析无法定义字段(仅定义 Model 级配置)
适用场景表已经在数据库中存在设计阶段、无法连接数据库、或需要覆盖默认值

两者可同时使用。相同 Model 在两处都有定义时,model-list 中的配置优先。

Q4: 支持哪些数据库?

支持 22 种数据库,完整列表见上方章节“8.1 支持的数据库”。

Q5: 配置文件格式和 Spring Boot 的 application.yml 一样吗?

完全一致。CLI 的 generator.yml 和 Spring Boot 的 application.yml 使用相同的配置节点结构。

Q6: 如何只为部分 Model 生成 Controller?

model-list 中为特定 Model 设置 create-controller: false

Q7: 如何只生成 Repository 层(不需要 Service / Controller)?

model-list 中设置 only-repository: true

Q8: Entity 父类的 BaseMyBatisPlusEntity 和 BaseMyBatisPlusSimpleEntity 有什么区别?

父类包含的公共字段
BaseMyBatisPlusEntity(默认)deleted、insertTime、lastUpdateTime
BaseMyBatisPlusSimpleEntity无公共字段(适用于关联表等简单场景)

Q9: 如何处理表名和类名的映射?

生成器按规则自动处理:

  1. 去除 table-prefix
  2. 下划线转驼峰
  3. 首字母大写

也可在 model-list 中通过 table-name 显式指定表名。

Q10: SMART 架构中如何切换 RPC 调用方式?

SMART 架构同时生成了 Spring Cloud 和 Dubbo 两套实现。切换方式通过改变依赖:

  • 引入 xxx-cloud-api 依赖 → 使用 Spring Cloud Feign 远程调用
  • 引入 xxx-dubbo-api 依赖 → 使用 Dubbo 远程调用
  • 引入 xxx-server 依赖 → 本地直接调用(用于单体部署场景)

无需修改任何业务代码。

Q11: 在 IDEA 插件市场搜索不到 EasyFK Generator?

可能是由于网络原因或插件市场索引延迟。可以从上方章节“3.1 插件安装”里的链接手动下载并安装。

12. 附录

12.1 枚举值速查表

配置项可选值说明
project-typesingle, micro_prd, microservice, smart项目架构类型
app-typeBMS, CLIENT应用类型
rpc-typecloud, dubboRPC 协议类型
build-typemaven, gradle构建工具
gradle-typegroovy, kotlinGradle DSL 类型
orm-typeMYBATIS, MYBATIS_FLEX, HIBERNATEORM 框架
prd-typenone, single, separationPRD 层策略
log-typeLOGBACK, LOG4J2日志框架
db-typeMYSQL, POSTGRE_SQL, ORACLE 等...数据库类型,支持 22+ 种常见数据库

12.2 生成文件清单

以下是一个 Model(如 Product)在不同架构下可能生成的全部文件:

文件SINGLEMICRO_PRDMICROSMART覆盖策略
PrdApp.java(启动类)不覆盖
application.yml(配置文件)不覆盖
logback.xml(日志配置)不覆盖
Product.java(Entity)强制刷新
ProductMapper.java不覆盖
ProductMapper.xml不覆盖
ProductDto.java强制刷新
ProductParam.java强制刷新
ProductReq.java不覆盖
ProductResp.java不覆盖
ProductEditReq.java不覆盖
IProductRepository.java不覆盖
ProductRepositoryImpl.java不覆盖
IProductService.java不覆盖
ProductServiceImpl.java不覆盖
IProductApi.java不覆盖
ProductApiServerImpl.java不覆盖
IProductRemote.java(Cloud)✅★不覆盖
ProductRemoteImpl.java(Cloud)✅★不覆盖
ProductApiScImpl.java不覆盖
IProductRemote.java(Dubbo)✅★不覆盖
ProductRemoteImpl.java(Dubbo)✅★不覆盖
ProductApiDubboImpl.java不覆盖
ProductController.java不覆盖
ProductBmsController.java✅★★✅★★不覆盖
TIP

★ MICROSERVICE 架构下根据 rpc-type 只生成 Cloud 或 Dubbo 其中一套

★★ 仅当 prd-type: separation 时生成

EasyFK Generator v3.2.12(插件 v1.0.2)— 让架构设计直接变成可运行的代码。

— END —