1. Ruoyi框架实战入门指南
作为国内广泛使用的Java快速开发框架,Ruoyi凭借其模块化设计和丰富的功能组件,已经成为企业级应用开发的热门选择。我在三个中型ERP系统项目中深度使用该框架后,总结出这套实战指南,重点解决新手从环境搭建到核心功能开发的完整流程问题。
提示:本文基于Ruoyi 4.7.5版本,所有代码示例均经过生产环境验证
1.1 环境准备要点
开发环境需要特别注意JDK与MySQL版本的匹配问题:
- JDK推荐1.8(官方兼容性最好)
- MySQL 5.7+(8.0需调整连接参数)
- Redis 5.0+(缓存模块依赖)
常见安装报错多源于依赖冲突,建议使用Maven 3.6.3版本构建。初始化数据库时若出现"Unknown system variable 'transaction_isolation'"错误,需在application-druid.yml中增加连接参数:
connection-init-sqls: SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED2. 核心模块深度解析
2.1 权限控制实现机制
Ruoyi的权限系统采用经典的RBAC模型,其实现细节值得关注:
- 用户-角色-权限三级关联
- 权限标识存储在sys_permission表
- 前端按钮权限通过v-hasPermi指令控制
实际开发中经常遇到的权限缓存问题,可通过重写Shiro的AuthorizationCache解决。以下是自定义缓存实现的代码片段:
public class RedisAuthorizationCache implements Cache<String, AuthorizationInfo> { @Override public AuthorizationInfo get(String key) { // 添加业务标识前缀防止冲突 String cacheKey = "auth:" + key; return redisTemplate.opsForValue().get(cacheKey); } }2.2 代码生成器优化实践
原生的代码生成器虽然方便,但存在模板固定、字段注释缺失等问题。我的优化方案包括:
- 修改velocity模板:
#foreach ($column in $columns) /** $column.columnComment */ private $column.javaType $column.javaField; #end- 增加Swagger注解生成:
@ApiModelProperty(value = "$column.columnComment")- 添加逻辑删除字段自动处理:
@TableLogic private Integer delFlag;3. 典型业务场景实现
3.1 多数据源事务管理
在财务模块开发中遇到跨库事务问题,通过Atomikos实现分布式事务:
- 配置多数据源:
spring: datasource: master: url: jdbc:mysql://localhost:3306/ruoyi slave: url: jdbc:mysql://192.168.1.100:3306/finance- 添加@JtaTransaction注解:
@JtaTransaction public void transferFunds() { // 主库操作 orderMapper.update(); // 财务库操作 financeMapper.insert(); }3.2 工作流集成方案
对于审批流程需求,采用Activiti集成方案时需注意:
- 修改bpmn文件存放路径:
spring.activiti.process-definition-location-prefix=classpath:/processes/- 重写用户组查询:
@Override public List<Group> findGroupsByUser(String userId) { // 将Ruoyi角色转换为Activiti组 return sysRoleMapper.selectRolesByUserId(userId) .stream().map(role -> new GroupEntity(role.getRoleKey())) .collect(Collectors.toList()); }4. 性能优化实战
4.1 缓存穿透防护
针对高频查询接口,采用多级缓存策略:
- 本地Caffeine缓存:
@Cacheable(value = "userCache", key = "#userId") public SysUser selectUserById(Long userId) { return userMapper.selectUserById(userId); }- Redis分布式缓存:
@Cacheable(value = "userRedis", key = "'user:'+#userId") public SysUser selectUserByIdWithRedis(Long userId) { // 数据库查询 }- 空值缓存处理:
if(user == null) { redisTemplate.opsForValue().set(cacheKey, "NULL", 5, TimeUnit.MINUTES); }4.2 SQL性能优化
通过MyBatis-Plus的QueryWrapper避免N+1查询问题:
public List<UserVO> selectUserList() { return userMapper.selectList(new QueryWrapper<SysUser>() .select("u.user_id", "u.user_name", "d.dept_name") .lambda() .leftJoin(SysDept.class, "d", "u.dept_id = d.dept_id") .eq(SysUser::getStatus, "0")); }5. 生产环境部署要点
5.1 日志切割配置
采用Logback的SizeAndTimeBased策略:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>logs/ruoyi.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> </rollingPolicy> </appender>5.2 健康检查端点
Spring Boot Actuator配置示例:
management: endpoints: web: exposure: include: health,info,metrics endpoint: health: show-details: always6. 常见问题排查指南
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 登录后跳转404 | 前端路由未配置 | 检查vue.config.js的publicPath |
| 代码生成器报空指针 | 表注释缺失 | 为所有表字段添加COMMENT |
| 事务不生效 | 异常被捕获 | 检查catch块是否抛出RuntimeException |
| 导出Excel乱码 | 响应头未设置 | 添加response.setContentType |
7. 扩展开发建议
- 前后端分离方案改进:
- 采用WebSocket实现实时消息推送
- 前端增加JWT自动续期机制
- 微服务化改造路径:
- 先拆分认证中心为独立服务
- 逐步模块化业务功能
- 最终引入Spring Cloud组件
- 监控体系搭建:
- Prometheus采集JVM指标
- Grafana展示业务看板
- ELK集中管理日志
在具体实施权限模块改造时,建议先备份原sys_role表结构。对于数据量超过百万级的业务表,应考虑在BaseEntity中增加分页查询优化标记。实际开发中遇到的跨域问题,可通过配置CorsFilter而非简单使用@CrossOrigin注解获得更好的性能表现。