RuoYi(若依)框架的介绍与基本使用(超详细分析)

**RuoYi(若依)**是一个基于Spring Boot和Spring Cloud的企业级快速开发平台。它集成了多种常用的技术栈和中间件,旨在帮助企业快速构建稳定、高效的应用系统。以下是关于RuoYi框架的详细介绍和基本使用教程,涵盖了从环境搭建到核心功能的使用。

RuoYi 框架简介

1. 技术栈
  • 后端技术:Spring Boot, MyBatis, Druid, Redis, Shiro/Spring Security, Quartz等
  • 前端技术:Vue.js, Element UI, Axios, Webpack等
  • 数据库:MySQL, Oracle, SQL Server等
  • 中间件:Nginx, RabbitMQ, Elasticsearch等
2. 核心功能
  • 权限管理:用户、角色、菜单、权限的管理
  • 系统管理:部门、岗位、字典、参数、通知公告等
  • 工具管理:代码生成器、在线表单、定时任务等
  • 监控管理:服务监控、操作日志、登录日志、在线用户等
  • 多租户支持:支持多租户模式,便于企业级应用的扩展

环境搭建

1. 开发环境准备
  • Java:安装JDK 8或更高版本
  • IDE:推荐使用IntelliJ IDEA或Eclipse
  • 数据库:安装MySQL 5.7或更高版本
  • Node.js:用于前端开发,安装Node.js 12或更高版本
  • Git:用于版本控制
2. 下载RuoYi源码
  • 访问RuoYi的GitHub仓库:https://github.com/y_project/RuoYi

  • 克隆项目到本地

    git clone https://github.com/y_project/RuoYi.git
    
3. 配置数据库
  • 创建数据库:

    CREATE DATABASE ruoyi DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  • 导入初始化SQL脚本:

    • 进入ruoyi/sql目录,找到ruoyi.sql文件

    • 执行SQL脚本:

      mysql -u root -p ruoyi < ruoyi.sql
      
4. 配置项目
  • 修改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
    
5. 构建和运行项目
  • 后端:

    • 打开IDE,导入项目
    • 运行ruoyi-admin模块中的RuoYiApplication启动类
  • 前端:

    • 进入ruoyi-ui目录

    • 安装依赖:

      npm install
      
    • 启动前端项目:

      npm run dev
      

基本功能使用

1. 登录
  • 打开浏览器,访问http://localhost:8080
  • 使用默认账号admin,密码admin123登录
2. 权限管理
  • 用户管理:添加、编辑、删除用户
  • 角色管理:创建、编辑、删除角色,分配权限
  • 菜单管理:创建、编辑、删除菜单,分配给角色
  • 权限管理:管理具体的权限点
3. 系统管理
  • 部门管理:创建、编辑、删除部门
  • 岗位管理:创建、编辑、删除岗位
  • 字典管理:管理系统的字典项
  • 参数管理:管理系统的参数配置
  • 通知公告:发布、编辑、删除通知公告
4. 工具管理
  • 代码生成器:根据数据库表生成CRUD代码
  • 在线表单:创建和管理表单
  • 定时任务:创建、编辑、删除定时任务
5. 监控管理
  • 服务监控:监控系统的健康状况
  • 操作日志:查看用户的操作记录
  • 登录日志:查看用户的登录记录
  • 在线用户:查看当前在线的用户

扩展功能

1. 多租户支持
  • ruoyi-system模块中,修改SysTenantService类,实现多租户逻辑
  • 在数据库中添加租户表,管理租户信息
  • 在前端页面中,增加租户切换功能
2. 接口文档
  • 使用Swagger生成API文档

  • 在ruoyi-admin模块中,添加Swagger依赖:

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-boot-starter</artifactId>
        <version>3.0.0</version>
    </dependency>
    
  • 配置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", "y_project@163.com"))
                    .version("1.0")
                    .build();
        }
    }
    

从项目的整体结构、核心模块、配置文件、主要功能等方面进行深入探讨。

项目结构

RuoYi项目采用微服务架构设计,主要分为以下几个模块:

  1. ruoyi-common:公共模块,包含一些常用的工具类和配置。
  2. ruoyi-auth:认证授权模块,负责用户的登录、权限校验等。
  3. ruoyi-system:系统管理模块,包括用户、角色、菜单、部门等管理功能。
  4. ruoyi-gen:代码生成模块,用于根据数据库表生成CRUD代码。
  5. ruoyi-job:定时任务模块,管理定时任务的创建、编辑和执行。
  6. ruoyi-monitor:监控模块,包括服务监控、操作日志、登录日志等。
  7. ruoyi-tool:工具模块,提供一些辅助工具,如在线表单等。
  8. ruoyi-admin:后端主项目,整合了上述所有模块。
  9. ruoyi-ui:前端项目,基于Vue.js和Element UI构建的前端界面。

核心模块详解

1. ruoyi-common

功能:提供一些常用的工具类和配置,如日期工具、字符串工具、常量定义等。

主要文件

  • config:配置文件,如数据库配置、Redis配置等。
  • core:核心工具类,如日期工具、字符串工具等。
  • exception:异常处理类。
  • utils:各种实用工具类。
2. ruoyi-auth

功能:负责用户的认证和授权,使用Spring Security或Shiro实现。

主要文件

  • config:安全配置类,如SecurityConfig
  • controller:认证控制器,如LoginController
  • domain:认证相关的实体类,如UserDetailsServiceImpl
  • service:认证服务,如UserService
3. ruoyi-system

功能:系统管理模块,包括用户、角色、菜单、部门等管理功能。

主要文件

  • controller:系统管理相关的控制器,如UserControllerRoleController等。
  • domain:系统管理相关的实体类,如SysUserSysRole等。
  • mapper:MyBatis映射文件,如SysUserMapper.xml
  • service:系统管理相关的服务类,如SysUserServiceSysRoleService等。
  • vo:视图对象,用于封装返回给前端的数据。
4. ruoyi-gen

功能:代码生成模块,根据数据库表生成CRUD代码。

主要文件

  • controller:代码生成相关的控制器,如GenController
  • domain:代码生成相关的实体类,如GenTable
  • mapper:MyBatis映射文件,如GenTableMapper.xml
  • service:代码生成相关的服务类,如GenTableService
  • util:代码生成工具类,如VelocityInitializer
5. ruoyi-job

功能:定时任务管理模块,使用Quartz实现。

主要文件

  • controller:定时任务相关的控制器,如JobController
  • domain:定时任务相关的实体类,如SysJob
  • mapper:MyBatis映射文件,如SysJobMapper.xml
  • service:定时任务相关的服务类,如SysJobService
  • util:定时任务工具类,如ScheduleUtils
6. ruoyi-monitor

功能:监控模块,包括服务监控、操作日志、登录日志等。

主要文件

  • controller:监控相关的控制器,如ServerControllerLogController
  • domain:监控相关的实体类,如SysLogininforSysOperLog
  • mapper:MyBatis映射文件,如SysLogininforMapper.xml
  • service:监控相关的服务类,如SysLogininforServiceSysOperLogService
7. ruoyi-tool

功能:工具模块,提供一些辅助工具,如在线表单等。

主要文件

  • controller:工具相关的控制器,如GenFormController
  • domain:工具相关的实体类,如GenForm
  • mapper:MyBatis映射文件,如GenFormMapper.xml
  • service:工具相关的服务类,如GenFormService
8. ruoyi-admin

功能:后端主项目,整合了上述所有模块。

主要文件

  • application.yml:主配置文件,包含各个模块的配置。
  • RuoYiApplication.java:主启动类。
  • config:全局配置类,如WebMvcConfigDruidConfig
  • controller:主控制器,如IndexController
  • filter:过滤器,如CorsFilter
  • interceptor:拦截器,如AuthTokenInterceptor
  • service:主服务类,如IndexService
9. ruoyi-ui

功能:前端项目,基于Vue.js和Element UI构建的前端界面。

主要文件

  • src
    

    :前端源代码目录。

    • api:API接口文件,如user.js
    • assets:静态资源文件,如图片、样式表。
    • components:自定义组件。
    • router:路由配置文件,如index.js
    • store:状态管理文件,如index.js
    • views:页面组件,如dashboard.vue
    • App.vue:主应用组件。
    • main.js:入口文件。

配置文件详解

1. application.yml

功能:主配置文件,包含各个模块的配置。

示例

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: y_project@163.com

主要功能详解

1. 登录

功能:用户登录系统,验证用户名和密码。

实现

  • 前端:在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("登录失败");
            }
        }
    }
    
2. 用户管理

功能:添加、编辑、删除用户。

实现

  • 前端:在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));
        }
    }
    
3. 角色管理

功能:添加、编辑、删除角色,分配权限。

实现

  • 前端:在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));
        }
    }
    

扩展功能

1. 多租户支持

功能:支持多租户模式,每个租户有独立的数据空间。

实现

  • 数据库:在数据库中添加租户表,如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<SysTenant> selectTenantList(SysTenant tenant);
        int insertTenant(SysTenant tenant);
        int updateTenant(SysTenant tenant);
        int deleteTenantById(Long tenantId);
    }
    
  • 前端:在ruoyi-ui/src/views/system/tenant/index.vue中,添加租户管理页面。

    <template>
      <div>
        <!-- 租户管理页面内容 -->
      </div>
    </template>
    
    <script>
    import axios from 'axios';
    
    export default {
      data() {
        return {
          tenantList: []
        };
      },
      methods: {
        getTenantList() {
          axios.get('/system/tenant').then(response => {
            this.tenantList = response.data.rows;
          });
        },
        addTenant() {
          // 添加租户逻辑
        },
        editTenant() {
          // 编辑租户逻辑
        },
        deleteTenant(id) {
          axios.delete(`/system/tenant/${id}`).then(response => {
            if (response.data.code === 200) {
              this.$message.success("删除成功");
            } else {
              this.$message.error(response.data.msg);
            }
          });
        }
      },
      mounted() {
        this.getTenantList();
      }
    };
    </script>
    

总结

RuoYi框架是一个非常强大的企业级快速开发平台,它集成了众多主流技术,可以帮助开发者快速搭建稳定、高效的应用系统。

<think>好的,我现在需要分析若依框架中hasPermi方法的实现原理。首先,我需要回忆一下若依框架基本结构。若依是基于Spring Boot和Spring Security的权限管理系统,所以权限控制可能和这些技术有关。 用户提到的hasPermi方法,应该是在前端或后端用于检查用户是否有某个权限的。根据常见的权限设计,可能涉及到注解、拦截器或者AOP。比如,Spring Security通常使用@PreAuthorize这样的注解来控制权限,但若依可能有自己的实现方式。 查看引用中的资料,引用[3]提到RuoYi-Vue使用了Spring Security,配置了登录接口和权限控制,还有token生成。这可能意味着权限验证Spring Security的整合有关。另外,引用[4]中提到了前端表单绑定和事件处理,但hasPermi可能在后端实现。 通常,权限方法如hasPermi会从用户的权限列表中检查是否存在对应的权限字符串。例如,用户登录后,其权限会被加载到SecurityContext中,然后在需要验证的地方,通过方法参数传入权限标识,检查当前用户是否有该权限。 在若依框架中,可能在后端有一个自定义的权限校验方法,结合了Spring Security的功能。比如,使用自定义的注解,在方法执行前进行权限判断。源码中可能有类似@RequiresPermissions的注解,或者通过拦截器来实现。 另外,引用[3]提到“异步任务管理操作日志数据权限”,说明权限可能和数据权限有关联,但hasPermi更可能针对功能权限。需要查看若依的权限处理模块,可能在common模块或security模块中。 可能的实现步骤:用户登录后获取权限列表,存储到上下文中。调用hasPermi时,从上下文中取出权限列表,判断是否包含所需的权限字符串。源码中可能使用SecurityUtils.getLoginUser().getPermissions()来获取权限,然后进行contains检查。 需要确认hasPermi的具体代码位置,可能在权限服务类中,或者作为工具方法提供。此外,若依可能通过自定义的PermissionService来处理权限校验,结合Spring Security的认证信息。 总结:hasPermi方法的实现原理可能是基于当前用户的权限列表,检查传入的权限字符串是否存在其中。这涉及到用户权限的加载、存储及校验过程,结合Spring Security的上下文管理。</think>若依框架的`hasPermi`方法实现原理可分为以下几个关键步骤: --- ### 一、权限数据加载存储 1. **用户登录时加载权限** 用户登录成功后,系统会从数据库查询用户的角色和权限标识(如`system:user:add`),并将这些权限绑定到用户对象中[^3]。 2. **存储到Security上下文** 权限数据通过Spring Security的`Authentication`对象存入安全上下文,可通过`SecurityContextHolder`获取: ```java LoginUser loginUser = SecurityUtils.getLoginUser(); Set<String> permissions = loginUser.getPermissions(); ``` --- ### 二、hasPermi方法源码分析 在`ruoyi-framework`模块的`com.ruoyi.framework.security.service.PermissionService`类中,核心逻辑如下: ```java public boolean hasPermi(String permission) { // 1. 超级管理员直接放行 if (SecurityUtils.isAdmin()) { return true; } // 2. 获取当前用户权限集合 Set<String> permissions = SecurityUtils.getLoginUser().getPermissions(); // 3. 检查权限标识是否存在 return permissions.contains(permission); } ``` **关键点解析**: - **管理员绕过校验**:若用户是管理员(如`isAdmin()`返回`true`),直接跳过权限检查。 - **权限集合来源**:权限数据在用户登录时已加载到`LoginUser`对象中。 - **精确匹配逻辑**:通过`contains`方法验证权限标识是否存在。 --- ### 三、权限控制的应用场景 1. **前端按钮级控制** 在Vue组件中使用`v-hasPermi`指令,动态隐藏无权限的按钮: ```vue <el-button v-hasPermi="'system:user:add'">新增用户</el-button> ``` 该指令底层调用`hasPermi`方法实现逻辑[^4]。 2. **后端接口拦截** 结合自定义注解`@RequiresPermissions`和AOP切面,在方法执行前校验权限: ```java @RequiresPermissions("system:user:edit") public void editUser(User user) { // 业务逻辑 } ``` --- ### 四、其他模块的关联 1. **数据权限扩展** 若依框架通过`@DataScope`注解实现数据权限,`hasPermi`的功能权限形成互补。 2. **动态数据源依赖** 权限数据查询依赖`ruoyi-common-datasource`模块,该模块封装了动态数据源配置[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涔溪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值