从零构建企业级员工管理系统:RuoYi-Cloud实战全解析

最近在帮朋友的公司搭建内部管理系统时,发现很多中小团队都在寻找既能快速开发又具备企业级架构的解决方案。RuoYi-Cloud作为国内流行的开源微服务框架,其代码生成器和权限体系特别适合这类需求。本文将手把手带你用RuoYi-Cloud实现一个完整的员工管理系统,过程中会重点解决几个实际痛点:如何避免Nacos配置踩坑、Sentinel流控规则配置技巧,以及前后端联调时的常见问题。

1. 环境准备与工具选型

在开始编码前,我们需要搭建好基础运行环境。与单体应用不同,微服务架构对中间件的依赖更多,这里我推荐使用Docker来管理这些服务,既能保证环境统一又方便迁移。

必备组件清单

  • JDK 1.8+(建议Amazon Corretto 11)
  • MySQL 5.7+(重要数据记得定期备份)
  • Redis 6.x(用于会话管理和缓存)
  • Node.js 14+(前端构建依赖)

注意:RuoYi-Cloud最新版要求Nacos 2.0+,低版本会出现兼容性问题。我曾因为版本不匹配浪费了两小时排查连接异常。

1.1 中间件安装指南

以Mac环境为例,用Homebrew快速安装:

# 安装Redis
brew install redis
brew services start redis

# 安装MySQL
brew install mysql
brew services start mysql

Nacos和Sentinel建议直接下载官方压缩包:

# Nacos 2.1.0
wget https://github.com/alibaba/nacos/releases/download/2.1.0/nacos-server-2.1.0.tar.gz
tar -zxvf nacos-server-2.1.0.tar.gz
cd nacos/bin
sh startup.sh -m standalone  # 单机模式启动

# Sentinel 1.8.5
wget https://github.com/alibaba/Sentinel/releases/download/1.8.5/sentinel-dashboard-1.8.5.jar
java -Dserver.port=18080 -jar sentinel-dashboard-1.8.5.jar

启动后访问地址:

  • Nacos控制台:http://localhost:8848/nacos (账号nacos/nacos)
  • Sentinel控制台:http://localhost:18080 (账号sentinel/sentinel)

2. 项目初始化与配置

从GitHub克隆最新代码:

git clone https://github.com/yangzongzhuan/RuoYi-Cloud.git
cd RuoYi-Cloud
mvn clean install

2.1 数据库配置

创建两个数据库:

-- 系统库
CREATE DATABASE `ry-cloud` DEFAULT CHARACTER SET utf8mb4;
-- 业务库
CREATE DATABASE `ry-employee` DEFAULT CHARACTER SET utf8mb4;

在Nacos中配置数据源(配置列表 -> 新建配置):

# DataSource配置
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: 123456

2.2 微服务路由配置

修改 ruoyi-gateway application.yml ,添加员工管理路由:

routes:
  # 员工管理
  - id: ruoyi-employee
    uri: lb://ruoyi-system
    predicates:
      - Path=/employee/**
    filters:
      - StripPrefix=1

3. 代码生成实战

RuoYi的代码生成器是其最大亮点,能自动生成前后端全套代码。我们以员工表为例演示完整流程。

3.1 数据库表设计

ry-cloud 库执行DDL:

CREATE TABLE `sys_employee` (
  `employee_id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL COMMENT '姓名',
  `gender` char(1) DEFAULT '0' COMMENT '性别(0男 1女)',
  `dept_id` bigint DEFAULT NULL COMMENT '部门ID',
  `position` varchar(50) DEFAULT NULL COMMENT '职位',
  `entry_date` datetime DEFAULT NULL COMMENT '入职日期',
  `status` char(1) DEFAULT '0' COMMENT '状态(0在职 1离职)',
  PRIMARY KEY (`employee_id`)
) ENGINE=InnoDB COMMENT='员工表';

3.2 代码生成步骤

  1. 登录系统后台,进入"系统工具 -> 代码生成"
  2. 点击"导入"选择刚创建的表
  3. 配置生成参数:
配置项 示例值 说明
生成包路径 com.ruoyi.employee Java包结构
生成模块名 system 对应微服务模块
生成业务名 employee URL路径前缀
生成功能名 员工管理 前端菜单显示名称
上级菜单 系统管理 菜单归属分类
  1. 点击"预览"确认无误后生成代码
  2. 将生成的代码分别放置到对应位置:
    • 后端代码: ruoyi-system 模块对应包下
    • 前端代码: ruoyi-ui src/views/system/employee

3.3 权限配置

执行生成的SQL菜单脚本后,需要配置角色权限:

  1. 进入"系统管理 -> 角色管理"
  2. 编辑管理员角色,勾选新增的"员工管理"权限
  3. 前端路由会自动注册,无需手动配置

4. 功能扩展与定制

基础CRUD生成后,通常需要根据业务需求进行定制。我们给员工管理增加几个实用功能。

4.1 部门树形选择器

修改前端表单:

<el-form-item label="所属部门" prop="deptId">
  <treeselect 
    v-model="form.deptId"
    :options="deptOptions"
    :normalizer="normalizer"
    placeholder="请选择部门"
  />
</el-form-item>

后端新增查询接口:

@GetMapping("/deptTree")
public AjaxResult getDeptTree() {
    return AjaxResult.success(deptService.selectDeptTree());
}

4.2 员工导入导出

利用RuoYi内置的Excel工具快速实现:

// 导出注解
@Excel(name = "员工姓名")
private String name;

@Excel(name = "性别", readConverterExp = "0=男,1=女")
private String gender;

// 导入校验
@NotBlank(message = "姓名不能为空")
private String name;

4.3 微服务接口熔断

ruoyi-system 中配置Sentinel规则:

@GetMapping("/{employeeId}")
@SentinelResource(value = "employeeDetail", 
                  blockHandler = "handleBlock",
                  fallback = "handleFallback")
public AjaxResult getDetail(@PathVariable Long employeeId) {
    // ...
}

// 熔断处理
public AjaxResult handleBlock(Long employeeId, BlockException ex) {
    return AjaxResult.error("系统繁忙,请稍后再试");
}

5. 部署与优化建议

完成开发后,我们需要考虑生产环境部署方案。这里分享几个实战经验:

  1. Nacos集群配置

    # cluster.conf
    192.168.1.101:8848
    192.168.1.102:8848
    192.168.1.103:8848
    
  2. Redis缓存优化

    spring:
      redis:
        lettuce:
          pool:
            max-active: 50
            max-wait: 1000ms
            max-idle: 20
    
  3. 前端性能调优

    # 生产环境构建
    npm run build:prod --report
    
  4. 接口文档集成 : 在网关模块添加Swagger配置:

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .pathMapping("/")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.ruoyi"))
                .build();
    }
    

最后提醒:测试阶段务必验证权限控制的完整性,特别是新增的接口。曾遇到过因为忘记加@PreAuthorize注解导致越权访问的问题。

更多推荐