简介
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都能为您提供简单、高效且功能完整的开发解决方案!

3340

被折叠的 条评论
为什么被折叠?



