第二十章. 代码生成:单表 CRUD (CURD) 实战

第二十章. 代码生成:单表 CRUD (CURD) 实战

摘要:本章是 RVP 框架的核心价值之一。我们将从零开始,实战演示如何使用“代码生成器”快速完成一个标准“商品管理”模块的开发。我们将重点掌握数据库表的设计规范、生成器配置、以及如何将数据库字段映射为丰富的前端 UI 控件。

本章学习路径

我们将严格按照“规范优先、配置在先”的最佳实践路径,分六步完成代码生成:

代码生成:单表 CRUD 实战(商品管理模块)


20.1. 理念与规范:设计“标准”的业务表

在开始使用代码生成器之前,最重要的一步是 设计数据库表。代码生成器虽然强大,但它依赖于“约定”——只有符合 RVP 框架设计规范的表,才能最大化地发挥其威力。

20.1.1. [核心] 为什么需要“标准字段”?

我们打开 Navicat,在 test_demo 演示表中,我们能看到 tenant_idcreate_bydel_flag 等字段。这些并不是业务字段,而是框架 内置功能 所依赖的“标准字段”。

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `test_demo` (
`id` bigint NOT NULL COMMENT '主键',
`tenant_id` varchar(20) COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号',
`create_dept` bigint DEFAULT NULL COMMENT '创建部门',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_by` bigint DEFAULT NULL COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`update_by` bigint DEFAULT NULL COMMENT '更新人',
`del_flag` int DEFAULT '0' COMMENT '删除标志',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='测试单表';

我们自己创建的任何业务表,都 强烈建议 包含这些字段:

标准字段数据类型含义核心价值
idbigint主键 ID唯一标识。
tenant_idvarchar(20)租户编号[SaaS 核心] 实现多租户数据隔离的基石。
create_deptbigint创建部门[数据权限] 自动填充,用于实现“本部门及以下”的数据权限。
create_bybigint创建者[数据权限] 自动填充,用于实现“仅本人”的数据权限。
create_timedatetime创建时间[审计] 自动填充,记录数据创建时间。
update_bybigint更新者[审计] 自动填充,记录最后更新人。
update_timedatetime更新时间[审计] 自动填充,记录最后更新时间。
del_flagchar(1)删除标志[逻辑删除] 框架默认使用 0 (正常) / 1 (删除) 进行逻辑删除。

20.1.2. 规范:表命名与前缀

数据库中的表数量众多,RVP 框架通过“前缀”来区分不同模块的表:

  • sys_:系统核心表(用户、角色、菜单等)
  • sj_:Snail Job 调度表
  • gen_:代码生成器表

我们在创建自己的业务表时,也应使用 统一的自定义前缀,例如 f_ (Feature) 或 biz_ (Business)。这样做的好处是:

  1. 快速定位:在几百张表中能一眼找到自己的业务表。
  2. 生成器配置:可以配置代码生成器“自动移除” f_ 前缀,让生成的 Java 类名更干净(例如 f_goods -> Goods.java)。

20.1.3. [实战] 创建 f_goods 商品表 (SQL)

现在,我们结合“标准字段”和“ f_ 前缀”规范,来创建一张用于实战的“商品表”。

打开 Navicat 或其他数据库工具,执行以下 SQL 语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE `f_goods` (
`id` bigint NOT NULL COMMENT '主键',
`tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号',
`name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称',
`price` decimal(10,2) DEFAULT NULL COMMENT '价格',
`description` text COLLATE utf8mb4_general_ci COMMENT '商品描述',
`on_sale_status` char(1) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否在售',
`goods_num` int DEFAULT NULL COMMENT '商品数量',
`classify` char(2) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品分类',
-- 下方是默认字段
`create_dept` bigint DEFAULT NULL COMMENT '创建部门',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_by` bigint DEFAULT NULL COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`update_by` bigint DEFAULT NULL COMMENT '更新人',
`del_flag` int DEFAULT '0' COMMENT '删除标志',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='测试商品表';

提示:为了快速设计,你也可以复制 test_demo 表,删除其业务字段,再添加自己的业务字段(如 name, price 等)。


20.1.4 本节小结

我们学习了 RVP 框架的数据库设计规范,并成功创建了包含“标准字段”和“自定义前缀”的 f_goods 商品表。

核心要点

  • tenant_idcreate_bydel_flag 等标准字段是框架实现 SaaS、数据权限和逻辑删除的基石。
  • 业务表应使用统一前缀(如 f_),便于管理和代码生成。

20.2. 前置准备:配置字典与生成器

在上一节中,我们创建了 f_goods 表。但在冲动地“导入”表之前,有两项关键的“前置准备”工作必须完成。提前完成这些配置,可以避免导入后再进行二次修改的繁琐操作。

  1. 创建数据字典f_goods 表中的“商品分类”和“是否在售”,在前端 UI 上我们希望它们是“下拉框”或“单选框”,而不是纯文本输入。字典就是用来提供这些选项的。
  2. 配置生成器:我们需要告诉代码生成器,新代码应该放在哪个 Java 模块(如 ruoyi-demo),以及自动移除我们约定的 f_ 表前缀。

20.2.1. [实战] 创建字典 (商品分类与在售状态)

我们登录 RuoYi-Vue-Plus 后台。

步骤一:创建“商品分类”字典

  1. 访问“系统管理” -> “字典管理”。
  2. 点击“新增”,创建字典类型:
    • 字典名称:商品分类
    • 字典类型:user_goods_classify (这个类型名是唯一的,后续配置要用)
  3. 创建成功后,在该条目上点击“字典数据”。
  4. 点击“新增”,添加字典数据:
    • 美食 (键值 0, 回显样式 primary)
    • 衣服 (键值 1, 回显样式 success)
    • 鞋子 (键值 2, 回显样式 warning)

步骤二:创建“是否在售”字典

  1. 返回“字典管理”,再次点击“新增”:
    • 字典名称:是否在售
    • 字典类型:user_on_sale_status
  2. 进入“字典数据”,点击“新增”:
    • (键值 0, 回显样式 info)
    • (键值 1, 回显样式 success)

完成这两步,数据字典就准备好了。

20.2.2. [重点] 配置 generator.yml (包路径与前缀)

接下来,我们配置代码生成器本身。

文件路径ruoyi-modules/ruoyi-generator/src/main/resources/generator.yml

ruoyi-generator 模块中找到并打开 generator.yml 配置文件。

我们要修改两个地方:

  1. packageName:默认的包路径。RVP 5.x 推荐将新业务代码放在 ruoyi-demo 模块,所以我们将默认路径改为 org.dromara.demo
  2. autoRemovePre:是否自动移除表前缀,我们改为 true
  3. tablePrefix:需要移除的前缀列表。默认只有 sys_,我们必须加上自定义的 f_

修改 generator.yml

1
2
3
4
5
6
7
8
9
10
# 代码生成
gen:
# 作者
author: Prorise
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
packageName: org.dromara.demo
# 自动去除表前缀,默认是false
autoRemovePre: true
# 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
tablePrefix: sys_,f_

20.2.3. 重启服务使配置生效

注意generator.ymlruoyi-generator 模块的配置文件。修改它之后,必须 重启后端主服务 (DromaraApplication),配置才能被加载生效。


20.2.4 本节小结

我们完成了导入表之前的两项关键准备工作:为 UI 创建了所需的数据字典,并配置了 generator.yml 以指定正确的包路径和自动移除 f_ 前缀。

核心要点

  • 必须先在“字典管理”中创建 UI 选项(如下拉框)所需的数据。
  • 必须在 generator.yml 中配置 packageNametablePrefix,这是最佳实践。
  • 修改 generator.yml 后,必须重启后端服务。

20.3. [核心] 导入与配置:从表到代码的映射

在上一节中,我们已经万事俱备:表已创建、字典已备好、生成器已配置。现在,我们正式开始执行代码生成的核心步骤:导入并配置 f_goods 表。

20.3.1. 导入表与“基本信息”配置

  1. 登录 RVP 后台,访问“系统工具” -> “代码生成”。
  2. 点击“导入”,在弹出的列表中找到我们创建的 f_goods 表,勾选它,点击“确定”。
  3. 此时 f_goods 表会出现在列表中,点击“编辑”按钮,进入配置界面。

image-20251113145040788

image-20251113145058323

配置“基本信息”选项卡
这个选项卡决定了代码的“身份”和“归属”。

  • 实体类名称:应为 Goods
    • (因为我们在 20.2.2 中配置了自动移除 f_ 前缀,这里会自动生成干净的类名。如果显示 FGoods,说明你的 generator.yml 配置未生效或未重启服务。)
  • 生成模块名:应为 demo
    • (它会自动根据 packageNameorg.dromara.demo)的最后一个词 demo 自动填充。)
  • 生成包路径:应为 org.dromara.demo
  • 上级菜单[核心] 这决定了生成的菜单显示在哪个父菜单下。我们点击选择,将其挂在“测试菜单”节点下。如果不选,它会默认挂在“系统工具”下。

20.3.2. [重点] 字段信息:配置 UI 类型

点击 “字段信息” 选项卡。这是代码生成器最强大的地方,它允许我们将“数据库列”映射为“前端 UI 控件”。

我们需要逐行检查业务字段,并设置它们的“显示类型”:

image-20251113165103317


20.4. 代码生成与三端部署

在上一节中,我们已经完成了 f_goods 表的所有配置。现在,我们进入最激动人心的一步:生成代码并将其部署到项目中。

操作:在代码生成列表页,找到 f_goods 条目,点击“生成代码”按钮。浏览器将下载一个 ZIP 压缩包(例如 ruoyi.zip)。

这个压缩包内包含了后端 Java 代码、前端 Vue/TS 代码以及 SQL 菜单脚本。我们需要将它们“各归其位”。

20.4.1. 步骤一:部署 SQL (菜单)

解压 ZIP 包,我们会看到一个 sql 目录,里面有一个 .sql 文件(如 goods_menu.sql)。

目的:这个 SQL 脚本的唯一作用是在 sys_menu 表中插入一条记录,也就是在 RVP 的左侧菜单栏中创建“商品管理”这个菜单项。

操作

  1. 打开此 .sql 文件,复制其内容。
  2. 打开 Navicat,连接到 ruoyi-vue 数据库。
  3. 点击“新建查询”,将 SQL 粘贴进去并执行。

20.4.2. 步骤二:部署后端 (Java 文件)

解压包中的 main 目录,就是我们需要的所有后端代码。

目的:将 Controller, Service, Mapper, Domain 等 Java 类和 Mapper XML 文件复制到 ruoyi-demo 模块中。

操作

  1. 文件路径ruoyi-modules/ruoyi-demo/src/
  2. 将解压得到的 main 目录,直接复制并粘贴ruoyi-demo 模块的 src 目录下。
  3. 当提示“合并目录”时,选择“是”。

此操作会智能地将新文件(如 GoodsController.java, IGoodsService.java 等)放入 demo 模块的对应包(controller, service)中。

20.4.3. 步骤三:部署前端 (Vue 文件)

解压包中的 vue 目录(在 plus-ui 目录下),我们会看到 apiviews 两个文件夹。

目的:将前端的 API 请求 TS 文件和 Vue 页面文件复制到 plus-ui 项目中。

操作

  1. 文件路径plus-ui/src/
  2. 将解压得到的 apiviews 两个目录,复制并粘贴plus-ui 项目的 src 目录下。
  3. 同样,提示“合并目录”时,选择“是”。

20.4.4. 步骤四:重启与验证

关键一步:由于我们向后端添加了全新的 Java 类(Controller, Service),Spring Boot 必须重启才能扫描并加载这些新的 Bean。

操作

  1. 在 IDEA 中,停止 DromaraApplication (后端主服务)。
  2. 重新启动 DromaraApplication
  3. 前端 plus-ui 服务(Vite)通常会自动热更新,无需重启。