【GitHub项目推荐--RuoYi:基于SpringBoot的权限管理系统】

简介

RuoYi​(若依)是一个基于SpringBoot的权限管理系统,以其易读易懂、界面简洁美观的特点而广受欢迎。该系统采用Spring、MyBatis、Shiro等核心技术,没有其他重度依赖,是一个轻量级且功能完整的Java快速开发框架。

🔗 ​GitHub地址​:

https://github.com/yangzongzhuan/RuoYi

🚀 ​核心价值​:

权限管理 · SpringBoot · 轻量级 · 开源免费 · 快速开发

项目背景​:

  • 个人项目​:作者为女儿取名"若依"(寓意:你若不离不弃,我必生死相依)

  • 开发需求​:响应后台管理系统的开发需求

  • 学习价值​:适合学习和企业级开发

  • 开源精神​:完全开源,个人和企业免费使用

项目特色​:

  • 🎯 ​轻量级​:无重度依赖,简洁高效

  • 🎨 ​界面美观​:基于Hplus UI框架,界面简洁美观

  • 📚 ​易于学习​:代码易读易懂,适合学习

  • ⚡ ​快速开发​:提供快速开发能力

  • 🆓 ​完全免费​:永久免费开源使用

设计理念​:

  • 简洁性​:保持代码和架构的简洁

  • 实用性​:注重实际开发需求

  • 易用性​:降低学习和使用门槛

  • 稳定性​:保证系统的稳定运行

  • 扩展性​:提供良好的扩展能力


主要功能

1. ​核心功能体系

RuoYi提供了一套完整的权限管理系统解决方案,涵盖用户管理、权限控制、系统监控、代码生成等多个方面。

系统管理​:

用户管理:
- 用户信息: 系统用户基本信息管理
- 用户状态: 用户启用禁用状态管理
- 用户权限: 用户角色和权限分配
- 用户组织: 用户部门和岗位信息
- 用户日志: 用户操作和登录日志

部门管理:
- 组织架构: 树形组织架构管理
- 部门权限: 部门数据权限控制
- 部门排序: 部门显示顺序配置
- 部门编码: 部门编码体系管理
- 部门领导: 部门负责人管理

岗位管理:
- 岗位定义: 岗位基本信息定义
- 岗位权限: 岗位权限配置
- 岗位用户: 岗位用户关系管理
- 岗位排序: 岗位显示顺序配置
- 岗位状态: 岗位启用禁用状态

角色管理:
- 角色定义: 角色基本信息定义
- 权限分配: 菜单和按钮权限分配
- 数据权限: 数据范围权限控制
- 角色用户: 角色用户关系管理
- 角色状态: 角色启用禁用状态

菜单管理:
- 菜单结构: 多级菜单结构管理
- 菜单类型: 目录、菜单、按钮类型
- 权限标识: 权限标识符管理
- 菜单排序: 菜单显示顺序配置
- 菜单图标: 菜单图标配置

数据管理​:

字典管理:
- 字典类型: 字典分类管理
- 字典数据: 字典键值对管理
- 字典状态: 字典启用禁用状态
- 字典排序: 字典显示顺序配置
- 字典缓存: 字典数据缓存管理

参数管理:
- 参数配置: 系统参数配置管理
- 参数分组: 参数分组管理
- 参数值类型: 参数值类型管理
- 参数状态: 参数启用禁用状态
- 参数缓存: 参数数据缓存管理

通知公告:
- 公告发布: 系统公告发布管理
- 公告状态: 公告状态管理
- 公告类型: 公告分类管理
- 公告范围: 公告发布范围控制
- 公告日志: 公告查看日志记录

监控日志​:

操作日志:
- 操作记录: 系统操作记录管理
- 操作类型: 操作类型分类
- 操作结果: 操作成功失败记录
- 操作详情: 操作详细信息记录
- 操作查询: 操作日志查询功能

登录日志:
- 登录记录: 用户登录记录管理
- 登录状态: 登录成功失败记录
- 登录IP: 登录IP地址记录
- 登录时间: 登录时间记录
- 登录查询: 登录日志查询功能

在线用户:
- 用户状态: 当前在线用户状态
- 用户信息: 在线用户基本信息
- 会话管理: 用户会话管理
- 强制下线: 强制用户下线功能
- 实时监控: 实时用户监控

系统监控:
- 服务监控: 系统服务状态监控
- 缓存监控: 缓存数据监控管理
- 连接池监控: 数据库连接池监控
- 性能监控: 系统性能监控
- 资源监控: 系统资源使用监控

开发工具​:

代码生成:
- 单表生成: 单表代码生成功能
- 树表生成: 树形表代码生成
- 主子表生成: 主子表代码生成
- 模板配置: 代码模板配置管理
- 生成下载: 生成代码下载功能

系统接口:
- API文档: 自动生成API文档
- 接口测试: 接口在线测试功能
- 接口管理: 接口信息管理
- 接口权限: 接口访问权限控制
- 接口日志: 接口访问日志记录

定时任务:
- 任务管理: 定时任务管理
- 任务日志: 任务执行日志记录
- 任务状态: 任务状态管理
- 任务调度: 任务调度配置
- 任务监控: 任务执行监控

2. ​功能详情

权限控制​:

认证授权:
- 用户认证: 用户登录认证功能
- 权限验证: 权限访问验证控制
- 会话管理: 用户会话管理功能
- 密码加密: 密码加密存储验证
- 记住我: 记住登录状态功能

数据权限:
- 权限范围: 全部、本级、自定义等
- 数据过滤: 数据查询过滤条件
- 权限继承: 权限继承和覆盖
- 动态权限: 动态数据权限控制
- 权限审计: 数据权限审计日志

安全控制:
- XSS防护: XSS攻击防护功能
- CSRF防护: CSRF攻击防护功能
- SQL注入防护: SQL注入防护功能
- 访问控制: 访问权限控制功能
- 安全审计: 安全审计日志记录

系统监控​:

服务监控:
- CPU监控: CPU使用率监控
- 内存监控: 内存使用情况监控
- 磁盘监控: 磁盘空间监控
- 系统负载: 系统负载监控
- 运行时间: 系统运行时间监控

缓存监控:
- 缓存查询: 缓存数据查询功能
- 缓存管理: 缓存数据管理功能
- 缓存统计: 缓存使用统计功能
- 缓存清理: 缓存数据清理功能
- 缓存监控: 缓存状态监控功能

连接池监控:
- 连接状态: 数据库连接状态监控
- 连接统计: 连接使用统计功能
- 性能分析: SQL性能分析功能
- 连接管理: 连接管理功能
- 监控告警: 连接池监控告警功能

代码生成​:

生成配置:
- 数据表选择: 选择生成的数据表
- 模块配置: 生成模块配置管理
- 包名配置: 生成代码包名配置
- 作者配置: 代码作者信息配置
- 生成选项: 生成选项配置管理

生成类型:
- 实体类: 生成实体类代码
- Mapper接口: 生成Mapper接口代码
- Service类: 生成Service类代码
- Controller类: 生成Controller类代码
- 前端代码: 生成前端页面代码

模板管理:
- 模板编辑: 代码模板编辑功能
- 模板导入: 模板导入功能
- 模板导出: 模板导出功能
- 模板备份: 模板备份功能
- 模板恢复: 模板恢复功能

安装与配置

1. ​环境准备

系统要求​:

开发环境:
- JDK: 1.8+ 版本
- Maven: 3.0+ 版本
- MySQL: 5.7+ 版本
- Redis: 3.0+ 版本 (可选)
- IDE: IDEA或Eclipse

数据库支持:
- MySQL: 主要支持数据库
- Oracle: Oracle数据库支持
- PostgreSQL: PostgreSQL支持
- SQL Server: SQL Server支持
- 其他数据库: 多种数据库支持

部署环境:
- Tomcat: 8.0+ 版本
- JDK: 1.8+ 版本
- MySQL: 5.7+ 版本
- 操作系统: Windows/Linux/macOS

2. ​安装步骤

下载项目​:

# 克隆项目
git clone https://github.com/yangzongzhuan/RuoYi.git

# 或者下载ZIP包
# 从GitHub Releases页面下载

# 导入IDE
# 使用IDEA或Eclipse导入Maven项目

数据库初始化​:

-- 创建数据库
CREATE DATABASE ruoyi DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

-- 执行SQL脚本
-- 使用doc/sql目录下的SQL文件初始化数据库
-- ruoyi.sql 或 ruoyi_quartz.sql (如果需要定时任务功能)

-- 修改数据库配置
-- 修改application-druid.yml中的数据库连接信息

配置文件​:

# application-druid.yml
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: 123456

# application.yml
# 根据需要修改其他配置

启动项目​:

# 方式一:使用IDE启动
# 运行RuoYiApplication.java

# 方式二:使用Maven启动
mvn spring-boot:run

# 方式三:打包部署
mvn clean package
java -jar ruoyi.jar

# 方式四:使用提供的脚本
# Windows: ry.bat
# Linux: ry.sh

访问系统​:

默认地址: http://localhost:8080
默认账号: admin/admin123

3. ​配置说明

数据库配置​:

# 数据源配置
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: your_username
    password: your_password
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 60000

Redis配置​:

# Redis配置(可选)
spring:
  redis:
    host: localhost
    port: 6379
    password: 
    database: 0
    timeout: 3000ms
    lettuce:
      pool:
        max-active: 200
        max-wait: -1ms
        max-idle: 10
        min-idle: 0

日志配置​:

# 日志配置
logging:
  level:
    com.ruoyi: debug
  file:
    name: logs/ruoyi.log
  logback:
    rollingpolicy:
      max-file-size: 10MB
      max-history: 30

服务器配置​:

# 服务器配置
server:
  port: 8080
  servlet:
    context-path: /
  tomcat:
    uri-encoding: UTF-8
    max-threads: 200
    min-spare-threads: 10

使用指南

1. ​基本工作流

使用RuoYi的基本流程包括:环境准备 → 项目下载 → 数据库初始化 → 配置修改 → 项目启动 → 系统登录 → 功能使用 → 二次开发 → 部署上线。整个过程设计为简单直观,开发者可以快速上手。

2. ​基本使用

系统登录​:

默认访问地址:http://localhost:8080

默认账号:admin/admin123

用户管理​:

1. 登录系统后,进入"系统管理" -> "用户管理"
2. 可以查看、添加、修改、删除用户
3. 可以重置用户密码、分配角色
4. 可以设置用户状态(启用/禁用)

角色管理​:

1. 进入"系统管理" -> "角色管理"
2. 可以查看、添加、修改、删除角色
3. 可以分配菜单权限和数据权限
4. 可以设置角色状态(启用/禁用)

菜单管理​:

1. 进入"系统管理" -> "菜单管理"
2. 可以查看、添加、修改、删除菜单
3. 可以设置菜单类型(目录、菜单、按钮)
4. 可以设置菜单权限标识

代码生成​:

1. 进入"系统工具" -> "代码生成"
2. 选择需要生成代码的数据表
3. 配置生成选项(模块名、包名等)
4. 生成代码并下载
5. 将生成的代码放入对应位置

系统监控​:

1. 进入"系统监控" -> "在线用户"
2. 查看当前在线用户信息
3. 可以强制用户下线

4. 进入"系统监控" -> "服务监控"
5. 查看系统CPU、内存、磁盘使用情况
6. 查看系统运行信息

3. ​开发使用

实体类示例​:

// 用户实体类示例
public class SysUser extends BaseEntity {
    private static final long serialVersionUID = 1L;

    /** 用户ID */
    private Long userId;

    /** 部门ID */
    private Long deptId;

    /** 用户账号 */
    private String userName;

    /** 用户昵称 */
    private String nickName;

    /** 用户邮箱 */
    private String email;

    /** 手机号码 */
    private String phonenumber;

    /** 用户性别 */
    private String sex;

    /** 用户头像 */
    private String avatar;

    /** 密码 */
    private String password;

    /** 帐号状态(0正常 1停用) */
    private String status;

    /** 删除标志(0代表存在 2代表删除) */
    private String delFlag;

    // getter和setter方法
}

Service层示例​:

// 用户服务接口
public interface ISysUserService {
    /**
     * 根据条件分页查询用户列表
     */
    public List<SysUser> selectUserList(SysUser user);

    /**
     * 通过用户名查询用户
     */
    public SysUser selectUserByUserName(String userName);

    /**
     * 通过用户ID查询用户
     */
    public SysUser selectUserById(Long userId);

    /**
     * 校验用户名称是否唯一
     */
    public String checkUserNameUnique(SysUser user);

    /**
     * 校验手机号码是否唯一
     */
    public String checkPhoneUnique(SysUser user);

    /**
     * 校验email是否唯一
     */
    public String checkEmailUnique(SysUser user);

    /**
     * 新增用户信息
     */
    public int insertUser(SysUser user);

    /**
     * 修改用户信息
     */
    public int updateUser(SysUser user);

    /**
     * 用户授权角色
     */
    public void insertUserAuth(Long userId, Long[] roleIds);

    /**
     * 修改用户状态
     */
    public int updateUserStatus(SysUser user);

    /**
     * 修改用户基本信息
     */
    public int updateUserProfile(SysUser user);

    /**
     * 修改用户头像
     */
    public boolean updateUserAvatar(String userName, String avatar);

    /**
     * 重置用户密码
     */
    public int resetPwd(SysUser user);

    /**
     * 通过用户ID删除用户
     */
    public int deleteUserById(Long userId);

    /**
     * 批量删除用户信息
     */
    public int deleteUserByIds(Long[] userIds);
}

Controller层示例​:

// 用户控制层
@Controller
@RequestMapping("/system/user")
public class SysUserController extends BaseController {
    private String prefix = "system/user";

    @Autowired
    private ISysUserService userService;

    @Autowired
    private ISysRoleService roleService;

    @Autowired
    private ISysPostService postService;

    /**
     * 用户管理页面
     */
    @RequiresPermissions("system:user:view")
    @GetMapping()
    public String user() {
        return prefix + "/user";
    }

    /**
     * 用户列表查询
     */
    @RequiresPermissions("system:user:list")
    @PostMapping("/list")
    @ResponseBody
    public TableDataInfo list(SysUser user) {
        startPage();
        List<SysUser> list = userService.selectUserList(user);
        return getDataTable(list);
    }

    /**
     * 新增用户页面
     */
    @GetMapping("/add")
    public String add(ModelMap mmap) {
        mmap.put("roles", roleService.selectRoleAll());
        mmap.put("posts", postService.selectPostAll());
        return prefix + "/add";
    }

    /**
     * 新增用户保存
     */
    @RequiresPermissions("system:user:add")
    @Log(title = "用户管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(@Validated SysUser user) {
        if (!userService.checkUserNameUnique(user)) {
            return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
        } else if (!userService.checkPhoneUnique(user)) {
            return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
        } else if (!userService.checkEmailUnique(user)) {
            return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
        }
        user.setCreateBy(getLoginName());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        return toAjax(userService.insertUser(user));
    }
}

前端页面示例​:

<!-- 用户列表页面 -->
<div class="row">
    <div class="col-sm-12">
        <div class="ibox float-e-margins">
            <div class="ibox-title">
                <h5>用户列表</h5>
                <div class="ibox-tools">
                    <a class="collapse-link">
                        <i class="fa fa-chevron-up"></i>
                    </a>
                </div>
            </div>
            <div class="ibox-content">
                <div class="row">
                    <div class="col-sm-3">
                        <label>用户名称:</label>
                        <input type="text" class="form-control" id="userName">
                    </div>
                    <div class="col-sm-3">
                        <label>手机号码:</label>
                        <input type="text" class="form-control" id="phonenumber">
                    </div>
                    <div class="col-sm-3">
                        <label>状态:</label>
                        <select class="form-control" id="status">
                            <option value="">所有</option>
                            <option value="0">正常</option>
                            <option value="1">停用</option>
                        </select>
                    </div>
                    <div class="col-sm-3">
                        <label> </label>
                        <div class="input-group">
                            <button type="button" class="btn btn-primary" onclick="search()"><i class="fa fa-search"></i> 搜索</button>
                            <button type="button" class="btn btn-success" onclick="reset()"><i class="fa fa-refresh"></i> 重置</button>
                        </div>
                    </div>
                </div>
                <div class="hr-line-dashed"></div>
                <div class="row">
                    <div class="col-sm-12">
                        @permission('system:user:add')
                        <button type="button" class="btn btn-success" onclick="add()"><i class="fa fa-plus"></i> 新增</button>
                        @endpermission
                        @permission('system:user:remove')
                        <button type="button" class="btn btn-danger" onclick="removeAll()"><i class="fa fa-remove"></i> 删除</button>
                        @endpermission
                        <button type="button" class="btn btn-warning" onclick="exportData()"><i class="fa fa-download"></i> 导出</button>
                    </div>
                </div>
                <div class="table-responsive">
                    <table id="bootstrap-table"></table>
                </div>
            </div>
        </div>
    </div>
</div>

应用场景实例

案例1:企业后台管理系统

场景​:开发企业后台管理系统

解决方案​:使用RuoYi构建企业后台管理系统。

实施方法​:

// 自定义业务模块示例
@Service
public class CustomBusinessServiceImpl implements ICustomBusinessService {

    @Autowired
    private CustomBusinessMapper customBusinessMapper;

    @Override
    public List<CustomBusiness> selectCustomBusinessList(CustomBusiness customBusiness) {
        return customBusinessMapper.selectCustomBusinessList(customBusiness);
    }

    @Override
    public int insertCustomBusiness(CustomBusiness customBusiness) {
        customBusiness.setCreateTime(new Date());
        return customBusinessMapper.insertCustomBusiness(customBusiness);
    }

    @Override
    public int updateCustomBusiness(CustomBusiness customBusiness) {
        customBusiness.setUpdateTime(new Date());
        return customBusinessMapper.updateCustomBusiness(customBusiness);
    }

    @Override
    public int deleteCustomBusinessByIds(Long[] ids) {
        return customBusinessMapper.deleteCustomBusinessByIds(ids);
    }
}

企业后台价值​:

  • 权限控制​:完善的权限管理系统

  • 用户管理​:完整的用户管理体系

  • 数据安全​:数据安全和权限控制

  • 系统监控​:系统运行状态监控

  • 开发效率​:快速开发能力

案例2:学校管理系统

场景​:开发学校信息管理系统

解决方案​:使用RuoYi构建学校管理系统。

实施方法​:

// 学生管理服务示例
@Service
public class StudentServiceImpl implements IStudentService {

    @Autowired
    private StudentMapper studentMapper;

    @Override
    public List<Student> selectStudentList(Student student) {
        return studentMapper.selectStudentList(student);
    }

    @Override
    public Student selectStudentById(Long studentId) {
        return studentMapper.selectStudentById(studentId);
    }

    @Override
    public int insertStudent(Student student) {
        student.setCreateTime(new Date());
        return studentMapper.insertStudent(student);
    }

    @Override
    public int updateStudent(Student student) {
        student.setUpdateTime(new Date());
        return studentMapper.updateStudent(student);
    }

    @Override
    public int deleteStudentByIds(Long[] studentIds) {
        return studentMapper.deleteStudentByIds(studentIds);
    }

    @Override
    public String importStudent(List<Student> studentList, Boolean isUpdateSupport, String operName) {
        if (StringUtils.isNull(studentList) || studentList.size() == 0) {
            throw new BusinessException("导入学生数据不能为空!");
        }
        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        
        // 导入逻辑实现
        for (Student student : studentList) {
            try {
                // 验证学生信息是否唯一
                Student s = studentMapper.selectStudentByStudentNo(student.getStudentNo());
                if (StringUtils.isNull(s)) {
                    student.setCreateBy(operName);
                    this.insertStudent(student);
                    successNum++;
                    successMsg.append("<br/>" + successNum + "、学生 " + student.getStudentName() + " 导入成功");
                } else if (isUpdateSupport) {
                    student.setUpdateBy(operName);
                    this.updateStudent(student);
                    successNum++;
                    successMsg.append("<br/>" + successNum + "、学生 " + student.getStudentName() + " 更新成功");
                } else {
                    failureNum++;
                    failureMsg.append("<br/>" + failureNum + "、学生 " + student.getStudentName() + " 已存在");
                }
            } catch (Exception e) {
                failureNum++;
                String msg = "<br/>" + failureNum + "、学生 " + student.getStudentName() + " 导入失败:";
                failureMsg.append(msg + e.getMessage());
                log.error(msg, e);
            }
        }
        
        if (failureNum > 0) {
            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
            throw new BusinessException(failureMsg.toString());
        } else {
            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
        }
        return successMsg.toString();
    }
}

学校管理价值​:

  • 学生管理​:学生信息管理系统

  • 教师管理​:教师信息管理

  • 课程管理​:课程安排管理

  • 成绩管理​:学生成绩管理

  • 权限控制​:多角色权限管理

案例3:小型电商后台

场景​:开发小型电商后台管理系统

解决方案​:使用RuoYi构建电商后台。

实施方法​:

// 商品管理服务示例
@Service
public class ProductServiceImpl implements IProductService {

    @Autowired
    private ProductMapper productMapper;

    @Override
    public List<Product> selectProductList(Product product) {
        return productMapper.selectProductList(product);
    }

    @Override
    public Product selectProductById(Long productId) {
        return productMapper.selectProductById(productId);
    }

    @Override
    public int insertProduct(Product product) {
        product.setCreateTime(new Date());
        return productMapper.insertProduct(product);
    }

    @Override
    public int updateProduct(Product product) {
        product.setUpdateTime(new Date());
        return productMapper.updateProduct(product);
    }

    @Override
    public int deleteProductByIds(Long[] productIds) {
        return productMapper.deleteProductByIds(productIds);
    }

    @Override
    public String checkProductNameUnique(Product product) {
        Long productId = StringUtils.isNull(product.getProductId()) ? -1L : product.getProductId();
        Product info = productMapper.checkProductNameUnique(product.getProductName());
        if (StringUtils.isNotNull(info) && info.getProductId().longValue() != productId.longValue()) {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    @Override
    public String checkProductCodeUnique(Product product) {
        Long productId = StringUtils.isNull(product.getProductId()) ? -1L : product.getProductId();
        Product info = productMapper.checkProductCodeUnique(product.getProductCode());
        if (StringUtils.isNotNull(info) && info.getProductId().longValue() != productId.longValue()) {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    @Override
    public int updateProductStatus(Product product) {
        return productMapper.updateProduct(product);
    }

    @Override
    public int updateProductStock(Long productId, Integer stock) {
        Product product = new Product();
        product.setProductId(productId);
        product.setStock(stock);
        product.setUpdateTime(new Date());
        return productMapper.updateProduct(product);
    }
}

电商后台价值​:

  • 商品管理​:商品信息管理系统

  • 订单管理​:订单处理流程管理

  • 库存管理​:库存管理和预警

  • 会员管理​:会员信息和管理

  • 数据分析​:销售数据分析功能


总结

RuoYi作为一个基于SpringBoot的权限管理系统,通过其简洁的设计、完整的权限控制、丰富的功能和易用的界面,为开发者提供了一个优秀的快速开发平台。其开源特性和活跃社区,使其成为学习和企业开发的重要工具。

核心优势​:

  • 🎯 ​轻量级​:无重度依赖,简洁高效

  • 🎨 ​界面美观​:简洁美观的用户界面

  • 📚 ​易于学习​:代码易读易懂,适合学习

  • ⚡ ​快速开发​:提供快速开发能力

  • 🆓 ​完全免费​:永久免费开源使用

适用场景​:

  • 企业后台管理系统

  • 学校信息管理系统

  • 小型电商后台

  • 权限管理系统

  • 快速开发原型

立即开始使用​:

# 克隆项目
git clone https://github.com/yangzongzhuan/RuoYi.git

# 导入IDE
# 使用IDEA或Eclipse导入项目

# 初始化数据库
# 执行doc/sql目录下的SQL文件

# 修改配置
# 修改application-druid.yml中的数据库配置

# 启动项目
mvn spring-boot:run

# 访问系统
# http://localhost:8080
# 账号: admin/admin123

资源链接​:

  • 📚 ​项目地址​:GitHub仓库

  • 📖 ​在线演示​:官方演示地址

  • 💬 ​社区支持​:社区讨论和帮助

  • 🎥 ​使用教程​:使用教程和文档

  • 🔧 ​开发工具​:开发工具和插件

最佳实践​:

  • 🎯 ​模块化开发​:按功能模块进行开发

  • 🔒 ​权限控制​:完善的权限控制机制

  • 📊 ​日志管理​:完整的操作日志记录

  • 🧪 ​测试覆盖​:编写单元测试保证质量

  • 🚀 ​性能优化​:持续的性能优化和改进

通过RuoYi,您可以:

  • 快速入门​:快速上手SpringBoot开发

  • 学习实践​:学习企业级开发实践

  • 项目开发​:快速开发实际项目

  • 定制扩展​:根据需求定制和扩展

  • 部署上线​:部署到生产环境

无论您是学习SpringBoot开发、构建企业后台系统还是开发个人项目,RuoYi都能为您提供简单、高效且功能完整的开发解决方案!​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值