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_product → Product)
  4. 将下划线字段名转为驼峰命名(product_name → productName)
  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-dir是String-项目输出根目录。例:D:\workspace\projects
group-id是String-Maven groupId,例:com.example
project-name是String-项目名称,同时作为项目根目录名和各子模块名前缀。例:my-app
base-package是String-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-version否String3.2.12EasyFK 框架版本号
project-version否String1.0.0-SNAPSHOT生成的项目版本号
app-type是枚举-应用类型,决定生成的项目模板和配置风格。可选值:BMS(后台管理端)、CLIENT(面向 C 端)
create-prd-project否Booleantrue是否生成 PRD(Controller)子项目
create-repository否Booleanfalse是否生成独立的 Repository 子项目
controller-auto-config否Booleanfalse是否为 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-name是String-模块名称,用于配置类名、远程调用 serviceId、Controller 路径前缀等。例:myapp
author否Stringeb-jack代码注释中的作者信息
orm-type否枚举MYBATISORM 类型:MYBATIS / MYBATIS_FLEX / HIBERNATE
spring-annotation否Booleantrue是否在实现类上添加 Spring 注解(如 @Repository、@Service)。project-type 为 smart 时无效
create-controller否Booleantrue是否生成 Controller 层代码(全局控制,可被 Model 级别覆盖)
extends-supper-class否BooleantrueEntity 是否继承框架基类,基类提供 deleted、insertTime、lastUpdateTime 字段

数据库连接配置

配置项必填类型默认值说明
db-type否枚举MYSQL数据库类型
db-short-url条件必填String-数据库短连接地址,格式:host:port/database。仅使用 from-db-tables 时必填
db-user否Stringroot数据库用户名
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-prefix否String-全局表名前缀,生成类名时自动去除。例:配置 base_,表 base_product → 类名 Product
from-db-tables否String-需要从数据库读取结构的表名列表,逗号分隔。例: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-name是String-模型名称,大驼峰命名。对应所有类名前缀
model-desc否String-模型中文描述,用于代码注释、Swagger 文档描述等
table-name否String自动推导对应的数据库表名。不填则根据 model-name 自动推导
id-type否StringString主键字段的 Java 类型:String 或 Long
id-is-auto否Booleanfalse主键是否自增
super-class否StringBaseMyBatisPlusEntityEntity 父类的完全限定类名
only-repository否Booleanfalse是否只生成 Repository 层
create-controller否Booleantrue是否为该 Model 生成 Controller
table-prefix否String继承全局该 Model 专属的表前缀
forbidden-filed否String-禁用字段名(如 status),设置后 Controller 生成启用/禁用接口
resource-group否String继承全局该 Model 的资源权限分组
resource-name否String继承全局该 Model 的资源权限名称
resource-id否String继承全局该 Model 的资源权限 ID
resource-path否String继承全局该 Model 的资源权限前端路由路径
resource-sort否Integer继承全局资源组排序值
model-resource-sort否Integer自动计算当前 Model 的资源排序值
TIP
from-db-tables 和 model-list 的关系: 两者可以同时使用。from-db-tables 自动从数据库读取表结构生成 Model 信息。如果同一个 Model 在 model-list 中也有定义,则 model-list 中的配置作为覆盖项优先生效。

5.5 资源权限配置

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

配置项必填类型默认值说明
create-resource-annotation否Booleanfalse总开关:是否生成资源权限注解
resource-group否String-资源所属分组标识
resource-name否String-资源所属分组的显示名称
resource-id否String-资源分组 ID
resource-path否String-资源分组对应的前端路由路径
resource-sort否Integer10000资源分组的排序基础值
module-resource-sort否Integer10000各 Model 资源排序的起始值
increment-star否Integer100多个 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_prd,rpc-type: cloud 或 dubbo(必选)

生成的项目结构:

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-prd、doc-knife4j、registry-nacos、rpc-${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: microservice,rpc-type: cloud 或 dubbo

生成的项目结构(以 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.java、ClientApp.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;

会自动生成 createTimeStart 和 createTimeEnd 查询字段。

@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 —