【若依】代码生成实战:从单表到树形表,手把手教你配置与避坑
2026/7/14 13:32:33 网站建设 项目流程

1. 若依代码生成器入门指南

第一次接触若依的代码生成功能时,我完全被它的效率震惊了。这个功能特别适合需要快速开发基础CRUD功能的场景,比如后台管理系统中的用户管理、订单管理这些模块。作为一款基于Spring Boot的快速开发框架,若依的代码生成器能帮我们节省至少70%的重复编码工作。

先说说它的工作原理:你只需要设计好数据库表结构,若依就能自动生成前后端全套代码,包括实体类、Mapper接口、Service层、Controller层,甚至Vue前端页面和路由配置。这就像有个经验丰富的开发助手,帮你把枯燥的重复工作都包揽了。

我建议在开始前先准备好以下环境:

  • JDK 1.8+
  • Maven 3.5+
  • MySQL 5.7+
  • Redis(可选,用于会话管理)
  • 最新版若依框架源码(前后端分离版本)

2. 单表代码生成实战

2.1 数据库表设计规范

先从一个简单的商品表开始。建表时有几个关键点需要注意:

CREATE TABLE sys_product ( product_id BIGINT AUTO_INCREMENT COMMENT '商品ID', product_name VARCHAR(100) NOT NULL COMMENT '商品名称', price DECIMAL(10,2) COMMENT '商品价格', stock INT DEFAULT 0 COMMENT '库存数量', status CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)', create_time DATETIME COMMENT '创建时间', PRIMARY KEY (product_id) ) COMMENT='商品信息表';

特别注意

  1. 每个字段必须添加COMMENT注释,这会直接生成前端表单的label
  2. 主键推荐使用自增BIGINT类型
  3. 状态类字段建议用CHAR(1)类型
  4. 记得添加创建时间等审计字段

2.2 生成器配置详解

找到ruoyi-generator模块下的resources/generator.yml,关键配置如下:

gen: author: 你的名字 packageName: com.ruoyi.product autoRemovePre: true tablePrefix: sys_

建议将autoRemovePre设为true,这样生成的实体类会自动去掉表前缀。比如sys_product表会生成Product实体类,而不是SysProduct

2.3 代码生成步骤

  1. 启动项目后,访问【系统工具】→【代码生成】
  2. 点击【导入】按钮选择刚创建的表
  3. 在生成界面有几个关键配置:
    • 生成业务名:建议用英文如product
    • 上级菜单:选择这个功能要挂载的菜单节点
    • 生成包路径:保持与yml中一致com.ruoyi.product

有个实用技巧:生成模块名和业务名最好不同,比如模块用mall,业务用product,这样可以避免后续模块扩展时的命名冲突。

2.4 代码整合与调试

生成后会下载一个zip包,解压后:

  1. 将main文件夹覆盖到对应模块
  2. 前端代码复制到ruoyi-ui/src/views
  3. 执行生成的SQL脚本(会创建菜单权限)

常见问题排查:

  • 菜单不显示?检查SQL是否执行成功
  • 页面报404?确认前端路由路径是否正确
  • 查询无数据?检查Controller的@RequestMapping路径

3. 树形表开发指南

3.1 树形表设计要点

部门表是典型的树形结构:

CREATE TABLE sys_dept ( dept_id BIGINT AUTO_INCREMENT COMMENT '部门ID', parent_id BIGINT COMMENT '父部门ID', dept_name VARCHAR(50) NOT NULL COMMENT '部门名称', order_num INT COMMENT '显示顺序', status CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)', PRIMARY KEY (dept_id) ) COMMENT='部门表';

关键字段

  • parent_id:必须存在,标识父节点
  • order_num:排序字段
  • 建议添加level_path字段存储层级路径(如1.2.3)

3.2 生成器特殊配置

在代码生成界面:

  1. 模板类型选择"树表"
  2. 设置树编码字段(通常选主键)
  3. 设置树名称字段(如dept_name)

3.3 前端树形组件适配

生成的代码已经包含树形表格组件,但你可能需要调整:

<el-table :data="dataList" row-key="dept_id" :tree-props="{children: 'children', hasChildren: 'hasChildren'}"> ... </el-table>

常见问题:

  • 树形显示错乱?检查row-key是否配置正确
  • 新增子节点不刷新?手动调用this.getList()
  • 移动节点后排序异常?需要重写排序逻辑

4. 主从表开发技巧

4.1 主从表设计规范

订单和订单表示例:

-- 主表 CREATE TABLE sys_order ( order_id BIGINT AUTO_INCREMENT COMMENT '订单ID', order_no VARCHAR(50) COMMENT '订单编号', total_amount DECIMAL(12,2) COMMENT '总金额', PRIMARY KEY (order_id) ); -- 从表 CREATE TABLE sys_order_item ( item_id BIGINT AUTO_INCREMENT COMMENT '明细ID', order_id BIGINT COMMENT '订单ID', product_id BIGINT COMMENT '商品ID', quantity INT COMMENT '购买数量', PRIMARY KEY (item_id) );

外键规范

  • 从表必须包含主表ID字段
  • 字段名建议用主表名_id的格式
  • 需要添加联合索引提高查询效率

4.2 主子表代码生成

  1. 先导入主表,模板选"主子表"
  2. 再导入从表,系统会自动识别外键关系
  3. 生成时会创建主子表联查的SQL和VO对象

4.3 数据导出问题解决

主子表导出是个常见痛点,需要重写导出逻辑:

// 在OrderController中重写export方法 public void export(Order order, HttpServletResponse response) { List<Order> list = orderService.selectOrderList(order); ExcelUtil<Order> util = new ExcelUtil<>(Order.class); util.exportExcel(response, list, "订单数据"); // 单独处理子表数据 List<OrderItem> items = orderItemService.selectItemsByOrderIds( list.stream().map(Order::getOrderId).collect(Collectors.toList()) ); ExcelUtil<OrderItem> itemUtil = new ExcelUtil<>(OrderItem.class); itemUtil.exportExcel(response, items, "订单明细"); }

5. 常见问题解决方案

5.1 字段同步问题

当表结构变更时:

  1. 在代码生成界面点击【同步】按钮
  2. 勾选需要同步的字段
  3. 系统会保留已有业务代码,只更新字段定义

5.2 自定义模板方法

若依支持自定义模板:

  1. 复制ruoyi-generator/resources/templates下的模板文件
  2. 修改后放到resources/templates/custom目录
  3. 在generator.yml中配置模板路径

比如要修改Entity模板:

# 在custom/domain.java.vm中添加Lombok注解 @Data @Builder @NoArgsConstructor @AllArgsConstructor public class ${ClassName} { // 原有字段 }

5.3 性能优化建议

  1. 大数据量表:

    • 生成代码时关闭逻辑删除功能
    • 手动添加分页查询优化
    • 禁用不必要的字段查询
  2. 树形表查询:

    // 使用WITH RECURSIVE实现递归查询(MySQL8.0+) @Select("WITH RECURSIVE temp AS (" + "SELECT * FROM sys_dept WHERE dept_id = #{deptId} " + "UNION ALL " + "SELECT d.* FROM sys_dept d JOIN temp ON d.parent_id = temp.dept_id" + ") SELECT * FROM temp") List<Dept> selectChildrenDepts(Long deptId);

6. 高级应用技巧

6.1 多数据源支持

在generator.yml中配置其他数据源:

datasource: master: url: jdbc:mysql://主库IP:3306/ry slave: url: jdbc:mysql://从库IP:3306/ry

生成代码时选择对应数据源即可。

6.2 代码生成器二次开发

可以扩展GeneratorController:

@PostMapping("/batchGenCode") public void batchGenCode(String tables, HttpServletResponse response) { String[] tableNames = tables.split(","); for (String tableName : tableNames) { // 自定义批量生成逻辑 } // 打包下载 }

6.3 与工作流集成

若依支持Activiti流程引擎,可以在生成时:

  1. 勾选"是否流程表单"
  2. 设置流程定义KEY
  3. 生成的表单会自动添加审批按钮

最后提醒几个容易踩的坑:

  • 树形表必须包含parent_id字段
  • 主子表导出需要自己实现多sheet导出
  • 字段注释一定要写,否则前端显示会有问题
  • 生成后记得检查Controller的权限注解@RequiresPermissions

这些经验都是我实际项目中总结出来的,特别是树形表那个坑,曾经让我调试了整整一天。现在每次生成代码前,我都会先检查这几个关键点,省去了很多不必要的麻烦。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询