RuoYi-Cloud-Plus系统接口:自动生成
引言:告别重复劳动,拥抱智能开发
在微服务架构的开发过程中,你是否经常面临这样的困境?每新增一个业务模块,就需要手动编写大量的重复代码:Controller、Service、Mapper、Entity、VO、BO等。这不仅耗时耗力,还容易引入人为错误,影响代码质量和开发效率。
RuoYi-Cloud-Plus的代码生成器模块(ruoyi-gen)正是为了解决这一痛点而生。它基于数据库表结构,自动生成完整的后端接口和前端页面,让开发者能够专注于业务逻辑的实现,而不是重复的CRUD编码工作。
代码生成器核心架构
整体架构设计
flowchart TD
A[数据库表结构] --> B[GenController<br/>接口层]
B --> C[IGenTableService<br/>服务层]
C --> D[GenTableMapper<br/>数据访问层]
D --> E[Velocity模板引擎]
E --> F[代码文件生成]
F --> G[Java后端代码]
F --> H[Vue前端代码]
F --> I[SQL脚本]
F --> J[TypeScript类型定义]
核心组件说明
| 组件 | 功能描述 | 关键技术 |
|---|---|---|
| GenController | 提供RESTful接口,处理代码生成请求 | Spring Boot, Sa-Token |
| IGenTableService | 业务逻辑处理,代码生成核心服务 | MyBatis-Plus, Velocity |
| GenUtils | 工具类,处理表名转换、字段映射等 | Apache Commons, Hutool |
| Velocity模板 | 代码模板文件,支持自定义修改 | Apache Velocity |
接口自动生成流程详解
1. 数据库表识别与解析
代码生成器首先通过JDBC连接数据库,读取表结构和字段信息:
// 查询数据库表列表
@SaCheckPermission("tool:gen:list")
@GetMapping("/db/list")
public TableDataInfo<GenTable> dataList(GenTable genTable, PageQuery pageQuery) {
return genTableService.selectPageDbTableList(genTable, pageQuery);
}
系统支持多数据源,可以同时处理多个数据库中的表结构。
2. 智能字段类型映射
系统内置了完善的字段类型映射机制:
// 字段类型映射逻辑
if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType)) {
column.setJavaType(GenConstants.TYPE_STRING);
column.setHtmlType(GenConstants.HTML_INPUT);
} else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) {
column.setJavaType(GenConstants.TYPE_DATE);
column.setHtmlType(GenConstants.HTML_DATETIME);
} else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) {
column.setJavaType(GenConstants.TYPE_LONG);
column.setHtmlType(GenConstants.HTML_INPUT);
}
3. 模板引擎代码生成
使用Velocity模板引擎生成各类代码文件:
| 模板类型 | 生成文件 | 功能描述 |
|---|---|---|
| java/controller.java.vm | Controller类 | RESTful接口控制器 |
| java/service.java.vm | Service接口 | 业务逻辑接口 |
| java/serviceImpl.java.vm | Service实现类 | 业务逻辑实现 |
| java/domain.java.vm | Entity实体类 | 数据库映射实体 |
| java/bo.java.vm | BO业务对象 | 业务数据传输对象 |
| java/vo.java.vm | VO视图对象 | 前端展示数据对象 |
| java/mapper.java.vm | Mapper接口 | 数据访问接口 |
| xml/mapper.xml.vm | Mapper XML | SQL映射配置 |
| vue/index.vue.vm | Vue组件 | 前端页面组件 |
| ts/api.ts.vm | TypeScript API | 前端接口调用 |
| ts/types.ts.vm | TypeScript类型 | 前端类型定义 |
4. 完整的RESTful接口生成
生成的Controller包含标准的CRUD操作:
@RestController
@RequestMapping("/system/user")
public class UserController {
@GetMapping("/list")
public TableDataInfo<User> list(User user, PageQuery pageQuery) {
return userService.selectPageUserList(user, pageQuery);
}
@GetMapping("/{userId}")
public R<User> getInfo(@PathVariable Long userId) {
return R.ok(userService.selectUserById(userId));
}
@PostMapping
public R<Void> add(@RequestBody User user) {
return toAjax(userService.insertUser(user));
}
@PutMapping
public R<Void> edit(@RequestBody User user) {
return toAjax(userService.updateUser(user));
}
@DeleteMapping("/{userIds}")
public R<Void> remove(@PathVariable Long[] userIds) {
return toAjax(userService.deleteUserByIds(userIds));
}
}
高级特性与自定义配置
1. 多模板支持
系统支持两种模板类型:
- 单表模板(CRUD):标准的增删改查操作
- 树表模板(TREE):支持树形结构数据的操作
2. 智能字段处理
系统自动识别特殊字段并生成相应的前端组件:
// 自动识别状态字段生成单选框
if (StringUtils.endsWithIgnoreCase(columnName, "status")) {
column.setHtmlType(GenConstants.HTML_RADIO);
}
// 自动识别类型字段生成下拉框
else if (StringUtils.endsWithIgnoreCase(columnName, "type")) {
column.setHtmlType(GenConstants.HTML_SELECT);
}
// 自动识别图片字段生成上传组件
else if (StringUtils.endsWithIgnoreCase(columnName, "image")) {
column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD);
}
3. 权限控制集成
生成的代码自动集成Sa-Token权限框架:
@SaCheckPermission("system:user:list")
@GetMapping("/list")
public TableDataInfo<User> list(User user, PageQuery pageQuery) {
return userService.selectPageUserList(user, pageQuery);
}
4. 日志记录功能
所有操作自动记录审计日志:
@Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping
public R<Void> add(@RequestBody User user) {
return toAjax(userService.insertUser(user));
}
实战演练:从表结构到完整接口
步骤1:准备数据库表
假设我们有一个用户表结构:
CREATE TABLE sys_user (
user_id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(50) NOT NULL COMMENT '用户名',
nick_name VARCHAR(50) COMMENT '昵称',
email VARCHAR(100) COMMENT '邮箱',
phonenumber VARCHAR(11) COMMENT '手机号码',
sex CHAR(1) DEFAULT '0' COMMENT '性别(0男 1女 2未知)',
avatar VARCHAR(255) COMMENT '头像',
password VARCHAR(100) COMMENT '密码',
status CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
del_flag CHAR(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
login_ip VARCHAR(50) COMMENT '最后登录IP',
login_date DATETIME COMMENT '最后登录时间',
create_by VARCHAR(64) COMMENT '创建者',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '更新者',
update_time DATETIME COMMENT '更新时间',
remark VARCHAR(500) COMMENT '备注'
) COMMENT = '用户信息表';
步骤2:通过接口导入表结构
调用代码生成器的导入接口:
POST /gen/importTable
Content-Type: application/x-www-form-urlencoded
tables=sys_user&dataName=master
步骤3:配置生成参数
系统会自动识别表结构并生成相应的配置:
| 配置项 | 自动生成值 | 说明 |
|---|---|---|
| 生成模块名称 | system | 根据包名自动提取 |
| 业务名称 | user | 根据表名自动提取 |
| 实体类名称 | SysUser | 驼峰命名转换 |
| 功能名称 | 用户信息 | 表注释处理 |
步骤4:生成代码
调用生成接口:
GET /gen/genCode/1
步骤5:查看生成结果
系统将生成完整的代码结构:
src/
├── main/
│ ├── java/
│ │ └── org/
│ │ └── dromara/
│ │ └── system/
│ │ ├── controller/
│ │ │ └── SysUserController.java
│ │ ├── domain/
│ │ │ └── SysUser.java
│ │ ├── mapper/
│ │ │ ├── SysUserMapper.java
│ │ │ └── xml/
│ │ │ └── SysUserMapper.xml
│ │ ├── service/
│ │ │ ├── ISysUserService.java
│ │ │ └── impl/
│ │ │ └── SysUserServiceImpl.java
│ │ └── domain/vo/
│ │ ├── SysUserVo.java
│ │ └── SysUserBo.java
└── resources/
└── mapper/
└── system/
└── SysUserMapper.xml
生成接口的功能特性
1. 完整的CRUD操作
生成的接口包含:
- 列表查询:支持分页、条件查询
- 详情查询:根据ID获取详细信息
- 新增操作:数据校验、业务逻辑处理
- 修改操作:部分更新、全量更新
- 删除操作:单个删除、批量删除
- 导出功能:数据导出为Excel等格式
2. 丰富的查询条件
自动根据字段类型生成相应的查询条件:
// 生成的查询条件示例
public TableDataInfo<SysUser> list(SysUser user, PageQuery pageQuery) {
LambdaQueryWrapper<SysUser> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(user.getUserName()), SysUser::getUserName, user.getUserName());
lqw.eq(StringUtils.isNotBlank(user.getStatus()), SysUser::getStatus, user.getStatus());
lqw.between(params.get("beginTime") != null && params.get("endTime") != null,
SysUser::getCreateTime, params.get("beginTime"), params.get("endTime"));
return userService.selectPageUserList(lqw, pageQuery);
}
3. 数据校验与安全性
自动集成数据校验和防注入保护:
@PostMapping
public R<Void> add(@Validated @RequestBody SysUserBo user) {
if (!userService.checkUserNameUnique(user)) {
return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
}
return toAjax(userService.insertUser(user));
}
自定义与扩展
1. 模板自定义
开发者可以修改Velocity模板来定制生成的代码风格:
## controller.java.vm 模板片段
package ${packageName}.${moduleName}.controller;
import org.dromara.common.core.domain.R;
import org.dromara.common.web.core.BaseController;
import ${packageName}.${moduleName}.domain.${ClassName};
import ${packageName}.${moduleName}.service.I${ClassName}Service;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
/**
* ${functionName}控制层
*/
@RestController
@RequestMapping("/${moduleName}/${businessName}")
@RequiredArgsConstructor
public class ${ClassName}Controller extends BaseController {
private final I${ClassName}Service ${className}Service;
}
2. 字段映射配置
通过修改GenConstants类来自定义字段映射规则:
// 自定义字段映射
public static final String[] CUSTOM_COLUMNNAME_NOT_QUERY = {
"id", "create_by", "create_time", "update_by", "update_time", "tenant_id"
};
3. 生成策略配置
支持多种生成策略配置:
| 配置项 | 默认值 | 说明 |
|---|---|---|
| 自动去除表前缀 | true | 自动去除配置的表前缀 |
| 作者名称 | RuoYi | 生成代码的作者信息 |
| 默认包名 | org.dromara | 生成代码的包路径 |
| 生成路径 | 项目根目录 | 代码生成的目标路径 |
最佳实践与注意事项
1. 命名规范建议
- 表名使用下划线分隔,如:sys_user
- 字段名使用下划线分隔,如:user_name
- 避免使用SQL关键字作为字段名
- 为每个表添加合适的注释
2. 性能优化建议
- 为经常查询的字段添加数据库索引
- 合理设置字段长度,避免过度分配
- 使用合适的数据类型,减少存储空间
3. 安全注意事项
- 敏感字段(如密码)需要在业务层进行加密处理
- 重要操作需要添加权限控制注解
- 输入参数需要进行严格的校验和过滤
总结
RuoYi-Cloud-Plus的代码生成器通过智能的数据库表结构分析,自动生成完整的后端接口和前端页面,极大地提高了开发效率。它不仅减少了重复的编码工作,还保证了代码的质量和一致性。
通过本文的详细介绍,相信你已经掌握了RuoYi-Cloud-Plus接口自动生成的核心原理和使用方法。在实际项目中,合理利用代码生成器,可以让你的开发工作事半功倍,专注于业务逻辑的创新和优化。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00