**RuoYi(若依)**是一个基于Spring Boot和Spring Cloud的企业级快速开发平台。它集成了多种常用的技术栈和中间件,旨在帮助企业快速构建稳定、高效的应用系统。以下是关于RuoYi框架的详细介绍和基本使用教程,涵盖了从环境搭建到核心功能的使用。
访问RuoYi的GitHub仓库:https://github.com/y_project/RuoYi
克隆项目到本地
git clone https://github.com/y_project/RuoYi.git
创建数据库:
CREATE DATABASE ruoyi DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
导入初始化SQL脚本:
进入ruoyi/sql
目录,找到ruoyi.sql
文件
执行SQL脚本:
mysql -u root -p ruoyi < ruoyi.sql
修改ruoyi-common/src/main/resources/ruoyi.properties
文件,配置数据库连接信息:properties深色版本
spring.datasource.url=jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=your_password
配置Redis(可选):properties深色版本
spring.redis.host=localhost
spring.redis.port=6379
后端:
ruoyi-admin
模块中的RuoYiApplication
启动类前端:
进入ruoyi-ui
目录
安装依赖:
npm install
启动前端项目:
npm run dev
http://localhost:8080
admin
,密码admin123
登录ruoyi-system
模块中,修改SysTenantService
类,实现多租户逻辑使用Swagger生成API文档
在ruoyi-admin模块中,添加Swagger依赖:
io.springfox
springfox-boot-starter
3.0.0
配置Swagger:
@Configuration
@EnableSwagger2WebMvc
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.ruoyi"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("RuoYi API 文档")
.description("RuoYi API 文档")
.contact(new Contact("RuoYi", "https://github.com/y_project/RuoYi", "[email protected]"))
.version("1.0")
.build();
}
}
从项目的整体结构、核心模块、配置文件、主要功能等方面进行深入探讨。
RuoYi项目采用微服务架构设计,主要分为以下几个模块:
功能:提供一些常用的工具类和配置,如日期工具、字符串工具、常量定义等。
主要文件:
config
:配置文件,如数据库配置、Redis配置等。core
:核心工具类,如日期工具、字符串工具等。exception
:异常处理类。utils
:各种实用工具类。功能:负责用户的认证和授权,使用Spring Security或Shiro实现。
主要文件:
config
:安全配置类,如SecurityConfig
。controller
:认证控制器,如LoginController
。domain
:认证相关的实体类,如UserDetailsServiceImpl
。service
:认证服务,如UserService
。功能:系统管理模块,包括用户、角色、菜单、部门等管理功能。
主要文件:
controller
:系统管理相关的控制器,如UserController
、RoleController
等。domain
:系统管理相关的实体类,如SysUser
、SysRole
等。mapper
:MyBatis映射文件,如SysUserMapper.xml
。service
:系统管理相关的服务类,如SysUserService
、SysRoleService
等。vo
:视图对象,用于封装返回给前端的数据。功能:代码生成模块,根据数据库表生成CRUD代码。
主要文件:
controller
:代码生成相关的控制器,如GenController
。domain
:代码生成相关的实体类,如GenTable
。mapper
:MyBatis映射文件,如GenTableMapper.xml
。service
:代码生成相关的服务类,如GenTableService
。util
:代码生成工具类,如VelocityInitializer
。功能:定时任务管理模块,使用Quartz实现。
主要文件:
controller
:定时任务相关的控制器,如JobController
。domain
:定时任务相关的实体类,如SysJob
。mapper
:MyBatis映射文件,如SysJobMapper.xml
。service
:定时任务相关的服务类,如SysJobService
。util
:定时任务工具类,如ScheduleUtils
。功能:监控模块,包括服务监控、操作日志、登录日志等。
主要文件:
controller
:监控相关的控制器,如ServerController
、LogController
。domain
:监控相关的实体类,如SysLogininfor
、SysOperLog
。mapper
:MyBatis映射文件,如SysLogininforMapper.xml
。service
:监控相关的服务类,如SysLogininforService
、SysOperLogService
。功能:工具模块,提供一些辅助工具,如在线表单等。
主要文件:
controller
:工具相关的控制器,如GenFormController
。domain
:工具相关的实体类,如GenForm
。mapper
:MyBatis映射文件,如GenFormMapper.xml
。service
:工具相关的服务类,如GenFormService
。功能:后端主项目,整合了上述所有模块。
主要文件:
application.yml
:主配置文件,包含各个模块的配置。RuoYiApplication.java
:主启动类。config
:全局配置类,如WebMvcConfig
、DruidConfig
。controller
:主控制器,如IndexController
。filter
:过滤器,如CorsFilter
。interceptor
:拦截器,如AuthTokenInterceptor
。service
:主服务类,如IndexService
。功能:前端项目,基于Vue.js和Element UI构建的前端界面。
主要文件:
src
:前端源代码目录。
api
:API接口文件,如user.js
。assets
:静态资源文件,如图片、样式表。components
:自定义组件。router
:路由配置文件,如index.js
。store
:状态管理文件,如index.js
。views
:页面组件,如dashboard.vue
。App.vue
:主应用组件。main.js
:入口文件。功能:主配置文件,包含各个模块的配置。
示例:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: localhost
port: 6379
thymeleaf:
cache: false
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:mapper/**/*.xml
druid:
initial-size: 5
min-idle: 5
max-active: 20
test-on-borrow: false
test-on-return: false
test-while-idle: true
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
filters: stat,wall,log4j
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
logging:
level:
com.ruoyi: info
file:
name: logs/ruoyi.log
swagger:
enabled: true
title: RuoYi API 文档
description: RuoYi API 文档
version: 1.0
contact:
name: RuoYi
url: https://github.com/y_project/RuoYi
email: [email protected]
功能:用户登录系统,验证用户名和密码。
实现:
前端:在ruoyi-ui/src/views/login/index.vue
中,使用Axios发送登录请求。
import axios from 'axios';
methods: {
handleLogin() {
const { username, password } = this.loginForm;
axios.post('/login', { username, password }).then(response => {
if (response.data.code === 200) {
this.$router.push('/dashboard');
} else {
this.$message.error(response.data.msg);
}
});
}
}
后端:在ruoyi-auth/controller/LoginController.java
中,处理登录请求。
@RestController
@RequestMapping("/auth")
public class LoginController {
@Autowired
private AuthenticationManager authenticationManager;
@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody) {
try {
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginBody.getUsername(), loginBody.getPassword());
Authentication authentication = authenticationManager.authenticate(authenticationToken);
if (authentication.isAuthenticated()) {
return AjaxResult.success("登录成功");
} else {
return AjaxResult.error("用户名或密码错误");
}
} catch (Exception e) {
return AjaxResult.error("登录失败");
}
}
}
功能:添加、编辑、删除用户。
实现:
前端:在ruoyi-ui/src/views/system/user/index.vue
中,使用Axios发送请求。
import axios from 'axios';
methods: {
addUser() {
axios.post('/system/user', this.userForm).then(response => {
if (response.data.code === 200) {
this.$message.success("添加成功");
} else {
this.$message.error(response.data.msg);
}
});
},
editUser() {
axios.put('/system/user', this.userForm).then(response => {
if (response.data.code === 200) {
this.$message.success("编辑成功");
} else {
this.$message.error(response.data.msg);
}
});
},
deleteUser(id) {
axios.delete(`/system/user/${id}`).then(response => {
if (response.data.code === 200) {
this.$message.success("删除成功");
} else {
this.$message.error(response.data.msg);
}
});
}
}
后端:在ruoyi-system/controller/UserController.java
中,处理用户管理请求。
@RestController
@RequestMapping("/system/user")
public class UserController {
@Autowired
private SysUserService userService;
@PostMapping
public AjaxResult addUser(@RequestBody SysUser user) {
return toAjax(userService.insertUser(user));
}
@PutMapping
public AjaxResult editUser(@RequestBody SysUser user) {
return toAjax(userService.updateUser(user));
}
@DeleteMapping("/{userId}")
public AjaxResult deleteUser(@PathVariable Long userId) {
return toAjax(userService.deleteUserById(userId));
}
}
功能:添加、编辑、删除角色,分配权限。
实现:
前端:在ruoyi-ui/src/views/system/role/index.vue
中,使用Axios发送请求。
import axios from 'axios';
methods: {
addRole() {
axios.post('/system/role', this.roleForm).then(response => {
if (response.data.code === 200) {
this.$message.success("添加成功");
} else {
this.$message.error(response.data.msg);
}
});
},
editRole() {
axios.put('/system/role', this.roleForm).then(response => {
if (response.data.code === 200) {
this.$message.success("编辑成功");
} else {
this.$message.error(response.data.msg);
}
});
},
deleteRole(id) {
axios.delete(`/system/role/${id}`).then(response => {
if (response.data.code === 200) {
this.$message.success("删除成功");
} else {
this.$message.error(response.data.msg);
}
});
}
}
后端:在ruoyi-system/controller/RoleController.java
中,处理角色管理请求。
@RestController
@RequestMapping("/system/role")
public class RoleController {
@Autowired
private SysRoleService roleService;
@PostMapping
public AjaxResult addRole(@RequestBody SysRole role) {
return toAjax(roleService.insertRole(role));
}
@PutMapping
public AjaxResult editRole(@RequestBody SysRole role) {
return toAjax(roleService.updateRole(role));
}
@DeleteMapping("/{roleId}")
public AjaxResult deleteRole(@PathVariable Long roleId) {
return toAjax(roleService.deleteRoleById(roleId));
}
}
功能:支持多租户模式,每个租户有独立的数据空间。
实现:
数据库:在数据库中添加租户表,如sys_tenant
。
CREATE TABLE sys_tenant (
tenant_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '租户ID',
tenant_name VARCHAR(50) NOT NULL COMMENT '租户名称',
status CHAR(1) NOT NULL COMMENT '状态(0正常 1停用)',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME DEFAULT NULL COMMENT '更新时间',
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (tenant_id)
) ENGINE=InnoDB AUTO_INCREMENT=100 COMMENT='租户表';
后端:在ruoyi-system/service/ISysTenantService.java
中,定义租户服务接口。
public interface ISysTenantService {
List selectTenantList(SysTenant tenant);
int insertTenant(SysTenant tenant);
int updateTenant(SysTenant tenant);
int deleteTenantById(Long tenantId);
}
前端:在ruoyi-ui/src/views/system/tenant/index.vue
中,添加租户管理页面。
RuoYi框架是一个非常强大的企业级快速开发平台,它集成了众多主流技术,可以帮助开发者快速搭建稳定、高效的应用系统。