【若依】代码生成实战:从单表到树形表,手把手教你配置与避坑 1. 若依代码生成器入门指南第一次接触若依的代码生成功能时我完全被它的效率震惊了。这个功能特别适合需要快速开发基础CRUD功能的场景比如后台管理系统中的用户管理、订单管理这些模块。作为一款基于Spring Boot的快速开发框架若依的代码生成器能帮我们节省至少70%的重复编码工作。先说说它的工作原理你只需要设计好数据库表结构若依就能自动生成前后端全套代码包括实体类、Mapper接口、Service层、Controller层甚至Vue前端页面和路由配置。这就像有个经验丰富的开发助手帮你把枯燥的重复工作都包揽了。我建议在开始前先准备好以下环境JDK 1.8Maven 3.5MySQL 5.7Redis可选用于会话管理最新版若依框架源码前后端分离版本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商品信息表;特别注意每个字段必须添加COMMENT注释这会直接生成前端表单的label主键推荐使用自增BIGINT类型状态类字段建议用CHAR(1)类型记得添加创建时间等审计字段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 代码生成步骤启动项目后访问【系统工具】→【代码生成】点击【导入】按钮选择刚创建的表在生成界面有几个关键配置生成业务名建议用英文如product上级菜单选择这个功能要挂载的菜单节点生成包路径保持与yml中一致com.ruoyi.product有个实用技巧生成模块名和业务名最好不同比如模块用mall业务用product这样可以避免后续模块扩展时的命名冲突。2.4 代码整合与调试生成后会下载一个zip包解压后将main文件夹覆盖到对应模块前端代码复制到ruoyi-ui/src/views下执行生成的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.33.2 生成器特殊配置在代码生成界面模板类型选择树表设置树编码字段通常选主键设置树名称字段如dept_name3.3 前端树形组件适配生成的代码已经包含树形表格组件但你可能需要调整el-table :datadataList row-keydept_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 主子表代码生成先导入主表模板选主子表再导入从表系统会自动识别外键关系生成时会创建主子表联查的SQL和VO对象4.3 数据导出问题解决主子表导出是个常见痛点需要重写导出逻辑// 在OrderController中重写export方法 public void export(Order order, HttpServletResponse response) { ListOrder list orderService.selectOrderList(order); ExcelUtilOrder util new ExcelUtil(Order.class); util.exportExcel(response, list, 订单数据); // 单独处理子表数据 ListOrderItem items orderItemService.selectItemsByOrderIds( list.stream().map(Order::getOrderId).collect(Collectors.toList()) ); ExcelUtilOrderItem itemUtil new ExcelUtil(OrderItem.class); itemUtil.exportExcel(response, items, 订单明细); }5. 常见问题解决方案5.1 字段同步问题当表结构变更时在代码生成界面点击【同步】按钮勾选需要同步的字段系统会保留已有业务代码只更新字段定义5.2 自定义模板方法若依支持自定义模板复制ruoyi-generator/resources/templates下的模板文件修改后放到resources/templates/custom目录在generator.yml中配置模板路径比如要修改Entity模板# 在custom/domain.java.vm中添加Lombok注解 Data Builder NoArgsConstructor AllArgsConstructor public class ${ClassName} { // 原有字段 }5.3 性能优化建议大数据量表生成代码时关闭逻辑删除功能手动添加分页查询优化禁用不必要的字段查询树形表查询// 使用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) ListDept 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 代码生成器二次开发可以扩展GeneratorControllerPostMapping(/batchGenCode) public void batchGenCode(String tables, HttpServletResponse response) { String[] tableNames tables.split(,); for (String tableName : tableNames) { // 自定义批量生成逻辑 } // 打包下载 }6.3 与工作流集成若依支持Activiti流程引擎可以在生成时勾选是否流程表单设置流程定义KEY生成的表单会自动添加审批按钮最后提醒几个容易踩的坑树形表必须包含parent_id字段主子表导出需要自己实现多sheet导出字段注释一定要写否则前端显示会有问题生成后记得检查Controller的权限注解RequiresPermissions这些经验都是我实际项目中总结出来的特别是树形表那个坑曾经让我调试了整整一天。现在每次生成代码前我都会先检查这几个关键点省去了很多不必要的麻烦。