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='商品信息表';特别注意:
- 每个字段必须添加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.3)
3.2 生成器特殊配置
在代码生成界面:
- 模板类型选择"树表"
- 设置树编码字段(通常选主键)
- 设置树名称字段(如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 主子表代码生成
- 先导入主表,模板选"主子表"
- 再导入从表,系统会自动识别外键关系
- 生成时会创建主子表联查的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 字段同步问题
当表结构变更时:
- 在代码生成界面点击【同步】按钮
- 勾选需要同步的字段
- 系统会保留已有业务代码,只更新字段定义
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") 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流程引擎,可以在生成时:
- 勾选"是否流程表单"
- 设置流程定义KEY
- 生成的表单会自动添加审批按钮
最后提醒几个容易踩的坑:
- 树形表必须包含parent_id字段
- 主子表导出需要自己实现多sheet导出
- 字段注释一定要写,否则前端显示会有问题
- 生成后记得检查Controller的权限注解
@RequiresPermissions
这些经验都是我实际项目中总结出来的,特别是树形表那个坑,曾经让我调试了整整一天。现在每次生成代码前,我都会先检查这几个关键点,省去了很多不必要的麻烦。